У меня есть файл данных, который я хочу использовать для нормализации awk
, основанный на последнем назначении данных. Поэтому я хотел бы сначала получить доступ к последней точке данных, чтобы нормализовать данные, а затем обработать в обычном режиме.
Следующий метод, использующий tac
дважды, делает работу, но, может быть, более сложный, чем необходимо.
$ cat file
0 5
1 2
2 3
3 4
$ tac file | awk 'NR==1{norm=$2} {print $1, $2/norm}' | tac
0 1.25
1 0.5
2 0.75
3 1
Мой вопрос заключается в следующем: возможно ли получить вышеуказанный результат, используя только awk?
Я думаю, что ответ «Нет, awk сканирует файл построчно», но я открыт для предложений по альтернативам.
источник
$ awk --version GNU Awk 3.1.8
. Можете ли вы добавить очень маленькое объяснение того, как обрабатываются два входных файла и чтоnext
делает?Если ваш источник данных - это файл, который можно прочитать несколько раз (т. Е. Это не поток), вы должны сначала использовать
tail(1)
данные, которые вы хотите получить из последней строки, и передать их в awk для последовательной обработки файла.tail
будет стремиться к концу файла, чтобы прочитать последнюю строку, без необходимости читать все данные перед этим.Это будет большой выигрыш для больших файлов, когда весь файл не помещается в буферный кеш (то есть его нужно будет считывать с диска дважды, один раз за каждый проход), и поможет в меньшей степени, не сканируя вход, чтобы добраться до последней строки. Меньшие файлы могут не сильно отличаться от двухпроходного подхода.
источник
Вы можете загрузить их в массив и прочитать в обратном направлении:
Вы могли бы сделать это более эффективно, но этот вид иллюстрирует, почему
awk
это не правильный инструмент для этого. Продолжайте использовать,tac
где возможно, GNU tac, как правило, самый быстрый из множества инструментов для этой работы.источник
for
-loops вawk
не является решением.