Это не приведет к сбою системы, но может занять много времени, так как входные данные анализируются несколько раз. Предполагая, что входной файл называется "in":
sort -u < in | while read w
do
printf "%d\t%s\n" `grep -c "$w" in` "$w"
done
что по вашему мнению меня зацепило:
1 america
3 and
1 england
1 jerry
2 to
1 tom
1 went
Сawk
:
awk -F'[_ ]' '
{ sum_records[$1"*.csv"] +=$NF; };
END { for (x in sum_records) print x, sum_records[x]; }' infile
Мы определили разделитель полей как для подчеркивания, так и для пробела; затем для каждого того же первого поля мы суммируем количество записей, затем в блоке END {... }
мы печатаем их.
Выход:
bb*.csv 4000
aa*.csv 1000
суффикс имени файла, указанный выше, мы жестко закодировали, но если у вас больше, чем просто.csv, вы можете изменить его следующим образом:
awk -F'[_.]' '
{ sum_records[$1 "*." $3]+=$NF; };
END { for (x in seen) print x, seen[x]; }' infile
обратите внимание, что мы также добавили точку .
в список разделителей полей и использовали $3
вместо жестко закодированного -"csv"
.
для входа, как показано ниже:
aa_20201123.csv 1000
bb_20201123.csv 1500
bb_20201123.txt 1234
bb_20201124.csv 2500
, что даст вам вывод следующим образом:
bb*.csv 4000
aa*.csv 1000
bb*.txt 1234