Вывести второй последний столбец / поле в awk - PullRequest
150 голосов
/ 19 января 2010

Я хочу напечатать второй последний столбец или поле в awk. Количество полей является переменным. Я знаю, что должен иметь возможность использовать $NF, но не уверен, как его можно использовать.

И это, похоже, не работает:

awk ' { print ( $NF-- )  } '

Ответы [ 9 ]

255 голосов
/ 19 января 2010
awk '{print $(NF-1)}'

Должно работать

21 голосов
/ 18 марта 2013

Небольшое дополнение к принятому ответу Криса Каннона: печатать, только если на самом деле есть второй последний столбец.

(
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) ) }'
)
13 голосов
/ 06 февраля 2015

Проще всего:

 awk '{print $--NF}' 

Причина, по которой оригинал $NF-- не сработал, заключается в том, что выражение вычисляется перед уменьшением, тогда как мое уменьшение префикса выполняется перед вычислением.

9 голосов
/ 20 января 2010
awk ' { print ( $(NF-1) ) }' file
4 голосов
/ 16 ноября 2014

Вы были недалеко от результата! Это делает это:

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
3 голосов
/ 09 сентября 2015

Perl-решение, похожее на awk-решение Криса Каннона:

perl -lane 'print $F[$#F-1]' file

Используются следующие параметры командной строки:

  • n цикл вокруг каждой строки входного файла, не печатать автоматически каждую строку

  • l удаляет символы новой строки перед обработкой и добавляет их потом

  • a режим автоматического разделения - разбить входные строки на массив @F. По умолчанию расщепление по пробелам

  • e выполнить код perl

Массив автоматического разделения @F начинается с индекса [0], а поля awk начинаются с $ 1.
$#F - количество элементов в @F

2 голосов
/ 18 июня 2016

Вы пытались начать справа налево с помощью команды rev?В этом случае вам просто нужно напечатать 2-й столбец:

seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11
1 голос
/ 11 октября 2016

Сначала уменьшает значение, а затем печатает его -

awk ' { print $(--NF)}' file

OR

rev file|cut -d ' ' -f2|rev
0 голосов
/ 15 июля 2015

Если у вас много столбцов и вы хотите напечатать все, кроме трех, в последнем случае, то это может помочь

awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'

...