Как найти определенное выражение в нескольких файлах с помощью Awk

Короче говоря:

В последней итерации

for(int i = 0; i<=name.length; i++) {

i будет равно name.length, что является незаконным индексом, так как индексы массива равны нулю, основанный.

Ваш код должен читать

for(int i = 0; i < name.length; i++) 
                 ^
0
задан Descartes 4 March 2019 в 12:47
поделиться

3 ответа

РЕДАКТИРОВАТЬ: Согласно комментариям @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.
0
ответ дан RavinderSingh13 4 March 2019 в 12:47
поделиться

Я бы добавил еще один способ с 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 работает с несколькими вхождениями в одном и том же случае строки
  • [118 ] -m2 улучшит производительность: после двух совпадений прекратите обработку файла.
  • awk line просто создает хеш-таблицу и выводит имена файлов с количеством совпадений> 1
0
ответ дан Kent 4 March 2019 в 12:47
поделиться

Вы можете попробовать и с 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
ответ дан stack0114106 4 March 2019 в 12:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: