Я хочу напечатать второй последний столбец или поле в awk. Количество полей является переменной. Я знаю, что я должен использовать $NF
, но не уверен, как его можно использовать.
И это не работает:
awk ' { print ( $NF-- ) } '
Я хочу напечатать второй последний столбец или поле в awk. Количество полей является переменной. Я знаю, что я должен использовать $NF
, но не уверен, как его можно использовать.
И это не работает:
awk ' { print ( $NF-- ) } '
awk '{print $(NF-1)}'
Должен работать
Небольшое дополнение к принятому ответу Криса Кэннона: только напечатайте, если на самом деле есть второй последний столбец.
(
echo | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 3 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
)
awk ' { print ( $(NF-1) ) }' file
Проще всего:
awk '{print $--NF}'
Причина, по которой исходный $NF--
не работал, заключается в том, что выражение оценивается до декремента, тогда как мой префиксный декремент выполняется перед оценкой.
Вы были недалеко от результата! Это делает:
awk '{NF--; print $NF}' file
Это уменьшает количество полей в одном, так что $NF
содержит первое предпоследнее.
Пусть генерируют некоторые числа и печатают их по группам из 5:
$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12
Пусть напечатайте предпоследний на каждой строке:
$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11
Решение Perl аналогично решению Chris Kannon awk:
perl -lane 'print $F[$#F-1]' file
Эти параметры командной строки используются:
n
перемещаться по каждой строке входного файла, не печатать автоматически каждую строку
l
удаляет символы новой строки перед обработкой и добавляет их обратно
a
режим автосброса - разделение входных строк на массив @F
. По умолчанию разделение на пробелы
e
выполнить код perl
Массив autosplit @F
начинается с индекса [0], тогда как awk-поля начинаются с $1. $#F
- количество элементов в @F
Вы пытались запустить справа налево, используя команду rev? В этом случае вам просто нужно напечатать второй столбец:
seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11
Если у вас много столбцов и вы хотите распечатать все, но не три cloumns в последнем, это может помочь
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'
Сначала уменьшает значение, а затем печатает его -
awk ' { print $(--NF)}' file
ИЛИ
rev file|cut -d ' ' -f2|rev