Печать второго последнего столбца / поля в awk

Я хочу напечатать второй последний столбец или поле в 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}' 

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

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

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

     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 похоже на решение awk Криса Кэннона:

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

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

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

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

    • автоматический режим – разделение входных строк на @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 
    Давайте будем гением компьютера.