Сценарии Linux для получения количества строковых шаблонов из папок и подпапок - PullRequest
0 голосов
/ 24 октября 2019

У меня есть папка, и в ней есть папки и подпапки.

Эти папки и подпапки содержат файлы, такие как

input_abc.txt 

input_def.txt

pattern1 - это 'RCA'; pattern2 - это 'RSA'

Структура папки:

Папка -subfolder -subfolder: input_abc.txt: input_def.txt

Мне нужно получить количество строк "pattern1" из файла с именем файла input_abc.txt, и янеобходимо получить количество строк "pattern2" из файла, имеющего имя файла input_def.txt в этих подпапках.

Как можно получить счетчик pattern1 вместе с именем файла input_abc.txt и шаблоном 2 вместе с именем файла input_def.txt из этих папок и подпапок в Linux.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Мы можем определить функцию srch как:

srch()(
  grep -nirc "${2}" * | grep "_${1}\.txt" | cut -f 2 -d":" | paste -sd+ - | bc > output_${1}_${2}.txt
)

Затем вызвать ее с помощью:

srch abc RCA;
srch def RSA

По сути, grep будет считать количество раз, которое строка появляется в каждомфайл, затем отфильтруйте файлы, которые не соответствуют суффиксу, который вы хотите (abc, def и т. д.). Затем он будет использовать cut для подсчета и сложения их с bc и перенаправления в файл output_*.txt

0 голосов
/ 24 октября 2019

Может быть, вам нужно find -iname NAME -exec grep -inr PATTERN {} \+:

➜  tree
.
├── b
│   ├── abc.txt
│   └── def.txt
└── c
    ├── abc.txt
    ├── def.txt
    └── ghi.txt

2 directories, 5 files

➜  for f in {b,c}/*; do printf "$f -- "; cat $f; done
b/abc.txt -- patt1
b/def.txt -- patt2
c/abc.txt -- patt1
c/def.txt -- patt2
c/ghi.txt -- patt1

➜  find . -iname abc.txt -exec grep -inr PATT1 {} \+
./c/abc.txt:1:patt1
./b/abc.txt:1:patt1

Что здесь происходит?

find находит все файлы с заданным именем (это глоб, а не регулярное выражение):-i означает игнорировать регистр, -exec запускает следующую команду (grep ...) для найденных файлов (представленных {}).

Обратите внимание на \+, что означает пропуск всехнайденные файлы в один grep (используйте \;, если вы хотите передать эти файлы каждому другому grep - не будут отображаться имена файлов).

Как видите, patt1 находится вb/abc.txt, c/abc.txt и c/ghi.txt, но последнее игнорируется find (имя не совпадает) и grep не будет работать с этим файлом.

...