Короче говоря:
В последней итерации
for(int i = 0; i<=name.length; i++) {
i
будет равно name.length
, что является незаконным индексом, так как индексы массива равны нулю, основанный.
Ваш код должен читать
for(int i = 0; i < name.length; i++)
^
РЕДАКТИРОВАТЬ: Согласно комментариям @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.
Я бы добавил еще один способ с 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
улучшит производительность: после двух совпадений прекратите обработку файла. Вы можете попробовать и с 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) и читается следующий файл.