С GNU awk для следующего файла и ENDFILE:
awk -v n=27 'FNR>n{f=1; nextfile} ENDFILE{if (!f) print FILENAME; f=0}' *.txt
С любым awk:
awk -v n=27 '
{ fnrs[FILENAME] = FNR }
END {
for (i=1; i<ARGC; i++) {
filename = ARGV[i]
if ( fnrs[filename] < n ) {
print filename
}
}
}
' *.txt
Они оба будут работать независимо от того, являются ли входные файлы пустыми или нет.Предостережения для не-gawk-версии те же, что и для других ваших текущих ответов на awk:
- Он основан на том же имени файла, которое не появляется несколько раз (например,
awk 'script' foo bar foo
), и вы хотите, чтобы оно отображалосьнесколько раз, и - Он основан на том, что в списке аргументов не заданы переменные (например,
awk 'script' foo FS=, bar
)
В версии gawk таких ограничений нет.
ОБНОВЛЕНИЕ:
Чтобы проверить время между вышеупомянутым сценарием GNU awk и сценарием GNU grep + sed, опубликованным xhienne , поскольку она заявила, что ее решение будет faster than a pure awk script
Я создал 10 000 входных файлов длиной от 0 до 1000 строк с помощью этого сценария:
$ awk -v numFiles=10000 -v maxLines=1000 'BEGIN{for (i=1;i<=numFiles;i++) {numLines=int(rand()*(maxLines+1)); out="out_"i".txt"; printf "" > out; for (j=1;j<=numLines; j++) print ("foo" j) > out} }'
, а затем выполнил над ними 2 команды и получил следующие результаты синхронизации 3-го запуска:
$ time grep -c -m28 -H ^ *.txt | sed '/:28$/ d; s/:[^:]*$//' > out.grepsed
real 0m1.326s
user 0m0.249s
sys 0m0.654s
$ time awk -v n=27 'FNR>n{f=1; nextfile} ENDFILE{if (!f) print FILENAME; f=0}' *.txt > out.awk
real 0m1.092s
user 0m0.343s
sys 0m0.748s
Оба скрипта создали одинаковые выходные файлы.Выше был запущен в Bash на Cygwin.Я ожидаю, что в разных системах результаты синхронизации могут немного отличаться, но разница всегда будет незначительной.
Для печати 10 строк по 20 случайных символов в строке (см. Комментарии):
$ maxChars=20
LC_ALL=C tr -dc '[:print:]' </dev/urandom |
fold -w "$maxChars" |
awk -v maxChars="$maxChars" -v numLines=10 '
{ print substr($0,1,rand()*(maxChars+1)) }
NR==numLines { exit }
'
0J)-8MzO2V\XA/o'qJH
@r5|g<WOP780
^O@bM\
vP{l^pgKUFH9
-6r&]/-6dl}pp W
&.UnTYLoi['2CEtB
Y~wrM3>4{
^F1mc9
?~NHh}a-EEV=O1!y
of
Чтобы сделать все это в пределах awk (что будет намного медленнее):
$ cat tst.awk
BEGIN {
for (i=32; i<127; i++) {
chars[++charsSize] = sprintf("%c",i)
}
minChars = 1
maxChars = 20
srand()
for (lineNr=1; lineNr<=10; lineNr++) {
numChars = int(minChars + rand() * (maxChars - minChars + 1))
str = ""
for (charNr=1; charNr<=numChars; charNr++) {
charsIdx = int(1 + rand() * charsSize)
str = str chars[charsIdx]
}
print str
}
}
$ awk -f tst.awk
Heer H{QQ?qHDv|
Psuq
Ey`-:O2v7[]|N^EJ0
j#@/y>CJ3:=3*b-joG:
?
^|O.[tYlmDo
TjLw
`2Rs=
!('IC
hui