Можно сделать это как решение с двумя передачами в awk:
awk 'FNR == NR { n = $2; next } { print $1, $2/n }' infile infile
Если Ваша версия awk поддерживает блок ENDFILE (например, GNU awk 4 +), можно сделать это как это:
awk 'ENDFILE { n = $2 } FNR != NR { print $1, $2/n }' infile infile
Обратите внимание, что более эффективно seek
в конец файла увидели ответ camh в первый раз.
Объяснение
Первый пример работает путем запоминания предыдущего $2
, т.е. это только оценено когда счетчик местной линии (FNR
) равно глобальному счетчику строки (NR
). next
управляйте пропусками к следующей строке, в этом случае она гарантирует, что последний блок только оценен, когда второй аргумент анализируется.
Второй пример имеет подобную логику, но использует в своих интересах блок ENDFILE, который оценен, когда конец входного файла достигнут.
Существует два общих решения, stdbuf
и unbuffer
.
stdbuf
от GNU coreutils, он был добавлен в версии 7.5 в 2009, таким образом, он пробился ко всем существующим невстроенным системам Linux кроме CentOS 5. Это находится также в FreeBSD начиная с версии 8.4. Никакой другой вариант Unix еще не принял его, что я знаю о, и в особенности не OpenBSD с 5,4.
unbuffer
Ожидать сценарий, и как таковой доступно, везде Ожидают, доступно, который включает в значительной степени любой Unix. Все варианты BSD имеют его в своем наборе порта, в expert
пакет.
Так установите expect
пакет и выполненный unbuffer hping … | perl …
expect version 5.45
в/usr/bin/expect
, однако,unbuffer
кажется, отсутствует. – cnst 25.11.2013, 04:22