Как найти определенное выражение в нескольких файлах с помощью Awk - PullRequest
0 голосов
/ 04 марта 2019

У меня как 500 текстовых документов.В каждом из них выражение «Numero de expediente» встречается хотя бы один раз.Я хочу найти каждый файл там, где есть хотя бы дважды.У каждого файла есть собственное имя, я не уверен, что это проблема (я не знаю, работает ли *.txt как в cmd с Windows).Так что да, я хотел бы знать, какой документ содержит это выражение, по крайней мере, дважды, и я не знаю, какая команда более полезна для этого, если grep или cat.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Я бы добавил еще один способ с grep и awk.grep отвечает за сопоставление.awk отфильтровывает файлы с соответствующим счетчиком> = 2:

grep -o -m2 'YOUR_PATTERN' *.txt
 |awk -F: '{a[$1]++}END{for(x in a)if(a[x]>1)print x}'

Примечание:

  • -o работает с несколькими вхождениями в одном и том же случае
  • -m2 улучшит производительность: после двух совпадений прекратите обработку файла.
  • строка awk просто создаст хеш-таблицу и выведет имена файлов с количеством совпадений> 1
0 голосов
/ 04 марта 2019

Вы также можете попробовать с Perl

perl -lne ' $x++ for(/Numero de expediente/g); if($x>=2) { print $ARGV;close(ARGV);$x=0 } ' *.txt

Значение $ x будет равно 0, и для каждого совпадения с образцом (Numero de expediente) оно будет увеличиваться, даже если шаблон появляется дважды в одном и том желиния.Если у вас есть как минимум 2 совпадения, дескриптор файла закрывается с помощью close (ARGV) и читается следующий файл.

0 голосов
/ 04 марта 2019

РЕДАКТИРОВАТЬ: В соответствии с комментариями @kent и @tripleee sir, я забочусь о нескольких случаях в одной строке сумма строк строки +, если кто-то awk НЕ поддерживаетnextfile Я создаю флаг типа no_processing, который просто пропускает строки, если он равен TRUE (после просмотра 2 экземпляров строки в любом файле).

awk 'FNR==1{count=0;no_processing=""} no_processing{next} {count+=gsub("Numero de expediente","")} count==2{print FILENAME;no_processing=1}' *.txt

ИЛИ (не одна строка)решения)

awk '
FNR==1{
  count=0
  no_processing=""
}
no_processing{
  next
}
{
  count+=gsub("Numero de expediente","")
}
count==2{
  print FILENAME
  no_processing=1
}
' *.txt


Не могли бы вы попробовать следующее, должно работать с GNU awk.

awk 'FNR==1{count=0} /Numero de expediente/{count++} count==2{print FILENAME " has at least 2 instances of searched string in it.";nextfile}' *.txt

Выше будет напечатано, например, -> test.txt has at least 2 instances of string in it. Если вы хотите просто напечатать имена файлов, попробуйте следующее.

awk 'FNR==1{count=0} /Numero de expediente/{count++} count==2{print FILENAME;nextfile}' *.txt

Объяснение: Добавление пояснения к приведенному выше коду сейчас.

awk '                          ##Starting awk program here.
FNR==1{                        ##Checking condition FNR==1 which will check if this is a 1st line for any new Input_file(since we are reading multiple Input_files from awk in this code).
  count=0                      ##Setting value of variable count as ZERO here.
}                              ##Closing BLOCK for FNR condition here.
/Numero de expediente/{        ##Checking condition here if a line contains string Numero de expediente in it then do following.
  count++                      ##Incrementing variable named count value with 1 here.
}                              ##Closing BLOCK for string checking condition here.
count==2{                      ##Checking condition if variable count value is 2 then do following.
  print FILENAME               ##Printing Input_file name here, where FILENAME is out of the box awk variable contains current Input_file name in it.
  nextfile                     ##nextfile will skip current Input_file, since we got 2 instances so need NOT to read this Input_file as per OP requirement and SAVE some time here.
}                              ##Closing BLOCK for count condition here.
' *.txt                        ##Mentioning *.txt which will pass all .txt extension files to it.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...