имена, которые происходят наибольшее число времен в наборе данных

Я бы Использование GREP GREP

grep -Fxvf oldfile newfile

-F : Используйте режим фиксированного строки (без метасимволов)

-x : сопоставить всю линию (не подстроить)

-F Oldfile : Прочитайте строки, которые должны быть сопоставлены из OldFile

-V : инвертировать матч, то есть строки печати не найдено в OldFile

0
26.06.2014, 02:14
2 ответа

Вы можете использовать

echo "hjsyeh hellodir ; awgshd newdir; hjsyeh hidir; jkdhjk welcomedir" | \
 sed -e "s/;\s*/\n/g" | awk '{print $1 }' | sort | uniq -c 

Вывод:

  1 awgshd
  2 hjsyeh
  1 jkdhjk

EDIT:. Выход в запрошенном формате с другим вызовом awk:

echo "hjsyeh hellodir ; awgshd newdir; hjsyeh hidir; jkdhjk welcomedir" |                                                                
  sed -e "s/;\s*/\n/g" | awk '{print $1 }' | sort | uniq -c | 
  awk '{ printf "%s -%s directories\n" , $2 , $1  }'

вывод:

awgshd -1 directories
hjsyeh -2 directories
jkdhjk -1 directories
2
28.01.2020, 02:28

Решение perl :

$ perl -anle '
    $h{$F[0]}++;
    END {
        $key_max = (sort { $h{$b} <=> $h{$a} } keys %h)[0];
        print "$key_max - $h{$key_max} directories";
    }
' file
hjsyeh - 2 directories

Это решение будет хорошо работать, если ваши данные малы. При работе с большими файлами для итерации через хэш необходимо использовать несколько perl-строек каждая , ключи , значения :

$ perl -anle '
    $h{$F[0]}++;
    END {
        while (($k,$v) = each %h) {
          if ($v > $max_val) {
              $max_key = $k;
              $max_val = $v;
          }
      }
      print "$max_key - $max_val directories";
    }
' file
hjsyeh - 2 directories
1
28.01.2020, 02:28

Теги

Похожие вопросы