попробуйте
awk 'NR == 1 {maxi=$1;}
{for(i=1;i<=NF;i++) if ($i > maxi) maxi=$i ;}
END { print maxi;}' file
где
NR == 1
предложение инициализируется для максимального значения первой строки первым полем. NF
устанавливается для каждой строки на номер поля FS = ","
или FS = ";"
в предложении BEGIN {}
. grep
действительно останавливается раньше, но он буферизует свой ввод, поэтому ваш тест слишком короткий (и да, я понимаю, что мой тест несовершенный поскольку он не доступен для поиска):
seq 1 10000 | (grep -q 2; cat)
начинается с 6776 в моей системе. Это соответствует буферу 32 КБ , используемому по умолчанию в GNU grep:
seq 1 6775 | wc
output
6775 6775 32768
Обратите внимание, что POSIX упоминает только улучшения производительности
При поиске в нескольких файлах
Это не оправдывает ожиданий. для повышения производительности за счет частичного чтения одного файла.
Вы путаете команды sed и grep.
Для команды sed -2q
говорит, что нужно выйти из текущей итерации, если во второй строке параметр -n
говорит, что нужно работать тихо, поэтому вы получите все строки после 2-го.
Команда grep запускается по умолчанию для вывода всех совпадающих строк, но параметр -q
говорит, что ничего не выводить в стандартный вывод. поэтому, если вход содержит «2», он будет иметь значение выхода УСПЕХ, в противном случае НЕИСПРАВНОСТЬ. Что это такое, зависит от вашей операционной системы и оболочки. Итак, обычно вы можете определить, совпадает ли строка, исследуя значение выхода процесса grep. Это полезно в конвейере, когда вы хотите знать, содержит ли ваш ввод какое-либо значение в качестве теста. Например.
if grep -q 'crash' <somelog.log ; then report_crash_via_email ; fi
В этом случае нам действительно не нужно видеть все совпадающие строки, нам просто важно, существует ли хотя бы одна. Затем процесс / функция report_crash_via_email
может отключиться и повторно открыть файл или нет.
Если вы хотите, чтобы ваш процесс grep останавливался после того, как он нашел символ «2» - он не будет по умолчанию, он будет проверять каждую строку, чтобы увидеть, соответствует ли она - вам нужно сказать ему, чтобы он сделал это. Ключ командной строки для этого - -m <значение>
. Итак, в вашем случае grep -q -m1 2
.
Очевидно, это связано с буферизацией, которую grep
делает для ускорения работы . Существуют инструменты, специально разработанные для чтения любого количества символов, но не более. Один из них - expect
:
{ expect -c "log_user 0; expect 2"; cat; } < infile
У меня нет системы, чтобы попробовать это, но я считаю, что ожидаю, что
съест все, пока не встретит ожидаемую строку ( 2
), а затем завершить, оставив остальную часть ввода для cat
.