список сгруппированных файлов с рисунком в каталоге - PullRequest
0 голосов
/ 13 апреля 2020

Представьте, что у меня есть следующие файлы / шаблон:

  • log_A_20000101.log
  • ...
  • log_A_20200412.log
  • .. .
  • log_B_20000101.log
  • ...
  • log_B_20200412.log
  • ...
  • log_C_20000101.log
  • ...
  • log_C_20200412.log
  • ...
  • log_D_20000101.log
  • ...
  • log_D_20200412.log

Я хочу подсчитать, сколько файлов существует для группы из них:

  • log_A _ *. Log 1234
  • log_B _ *. Log 3245
  • log_C _ *. Log 2343
  • log_D _ *. Log 6435

Проблема в том, что я не знаю, сколько у меня шаблонов, так как файлов так много, поэтому Я не знаю, есть ли A, B, C, D. Как я могу найти все образцы (и посчитать их)?

Ответы [ 3 ]

3 голосов
/ 13 апреля 2020

В одну сторону, используя GNU datama sh для подсчета:

find . -name "log_*.log" -print | datamash -s -t_ -g1,2 count 3 | sed 's/_\([^_]*\)$/_*.log \1/'

Или используя awk:

find . -name "log_*.log" -print | \
 awk -F_ '{ counts[$1"_"$2]++ }
          END { for (pat in counts) printf "%s_*.log %d\n", pat, counts[pat] }'
0 голосов
/ 13 апреля 2020

Использование только grep. Я использую «здесь документ», но вы можете кормить ввод через канал. Обратите внимание, что в приведенном ниже примере мы сопоставляем только A.

grep -Pch '(?<=log_)A(?=_[0-9]{8}\.log)' <<-EOF
log_A_20000101.log
log_A_20200412.log
log_B_20000101.log
log_B_20200412.log
log_C_20000101.log
log_C_20200412.log
log_D_20000101.log
log_D_20200412.log
EOF

Некоторое объяснение:

(?<=log_) ............. positive look-behind (just validate)
(?=_[0-9]{8}\.log) .... positive look-ahead
0 голосов
/ 13 апреля 2020

вы можете:

ls -1 | sed -En 's/(.*)_[0-9]+.log/\1_*.log/p' | uniq -c

передать вывод в sed, чтобы заменить цифры звездочкой и подсчитать уникальные записи

...