Вопрос
В папке я хотел бы напечатать имя каждого .txt
файла, содержащего n=27
строк или меньше строк. я мог бы сделать
wc -l *.txt | awk '{if ($1 <= 27){print}}'
Проблема в том, что многие файлы в папке составляют миллионы строк (и строки довольно длинны), и поэтому команда wc -l *.txt
очень медленная. В принципе процесс может подсчитывать количество строк до нахождения не менее n
строк, а затем перейти к следующему файлу.
Что такое более быстрая альтернатива?
FYI, я на MAC OSX 10.11.6
попытка
Вот попытка с awk
#!/bin/awk -f
function printPreviousFileIfNeeded(previousNbLines, previousFILENAME)
{
if (previousNbLines <= n)
{
print previousNbLines": "previousFILENAME
}
}
BEGIN{
previousNbLines=n+1
previousFILENAME=NA
}
{
if (FNR==1)
{
printPreviousFileIfNeeded(previousNbLines, previousFILENAME)
previousFILENAME=FILENAME
}
previousNbLines=FNR
if (FNR > n)
{
nextfile
}
}
END{
printPreviousFileIfNeeded(previousNbLines, previousFILENAME)
}
который можно назвать
awk -v n=27 -f myAwk.awk *.txt
Тем не менее, код не удается распечатать совершенно пустые файлы. Я не уверен, как это исправить, и я не уверен, что мой awk-скрипт - это путь.