Я бы Использование GREP
GREP
grep -Fxvf oldfile newfile
-F
: Используйте режим фиксированного строки (без метасимволов)
-x
: сопоставить всю линию (не подстроить)
-F Oldfile
: Прочитайте строки, которые должны быть сопоставлены из OldFile
-V
: инвертировать матч, то есть строки печати не найдено в OldFile
Вы можете использовать
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
Решение 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