Все, что мне нужно, это напечатать последние два столбца.
Все, что мне нужно, это напечатать последние два столбца.
Ответы:
Вы можете использовать переменную, NF
которая установлена на общее количество полей во входной записи:
awk '{print $(NF-1),"\t",$NF}' file
это предполагает, что у вас есть как минимум 2 поля.
awk '{print $(NF-1) "\t" $NF}' file
или awk '{print $(NF-1), $NF}' file
или awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
.
'{print $x,"\t",$y}'
заключается в том, что awk интерпретирует каждую переменную, разделенную запятыми, как свое собственное поле, поэтому результат будет фактически field1<space><tab><space>field2
(потому что он будет использовать разделитель пробелов по умолчанию), в отличие от того, field1<tab>field2
что, вероятно, вы ожидаете. использование разделителя выходных полей (OFS) - это почти всегда то, что вам нужно.
awk '{print $NF-1, $NF}' inputfile
Примечание: это работает, только если существует как минимум два столбца. На записях с одним столбцом вы получите ложный"-1 column1"
echo 1 2 3 | awk ...
. $NF-1
есть ($NF) - 1
в каждой awk
реализации.
yacc
грамматике, что является иронией, учитывая, что означает A в awk. Разные версии awk по-разному разбирают вещи? Большой сюрприз!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- или любым другим вводом, в котором второе последнее поле не на единицу меньше последнего поля.
@jim mcnamara: попробуйте использовать круглые скобки вокруг NF
, т.е. $(NF-1)
и $(NF)
вместо $NF-1
и $NF
(работает в Mac OS X 10.6.8 для FreeBSD awk
и gawk
).
echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'
# output:
# 1 2
# 2 3
# two three
$(NF-1)
- что, по крайней мере, более переносимо, чем $NF-1
; это определенно менее двусмысленно. $(NF)
это излишество - просто $NF
подойдет. Защита от строк с менее чем 2 столбцами также имеет смысл, так как в строках с одним столбцом вы получите значение первого столбца дважды , а с нулевыми столбцами, то есть пустыми, команда awk полностью завершится с ошибкой из-за попытки для доступа к полю с индексом -1.
использование gawk демонстрирует проблему:
gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three
Я только что поставил gawk на Solaris 10 M4000: Итак, gawk - это главная проблема в проблеме $ NF-1 против $ (NF-1). Следующий вопрос: что говорит POSIX? за:
http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html
В том или ином направлении нет направления. Не хорошо. gawk подразумевает вычитание, другие awks подразумевают номер поля или вычитание. хм.
$(NF-1)
заключается в том, что оба примера вычисления индекса поля в спецификации используют эту форму: $(NF-1)
и $(NF+2)
. Затем есть раздел «Выражения в awk», в котором указано, $expr
что они имеют [намного] более высокий приоритет, чем expr - expr
. Поскольку NF
само выражение, $NF-1
должно оцениваться как ($NF)-1
. В конце концов, даже если IF действительно существуют реализации awk, которые оценивают $NF-1
as $(NF-1)
, урок, извлеченный здесь, состоит в том, что using $(NF-1)
- это безопасный и переносимый выбор.
попробуйте с этим
$ cat /tmp/topfs.txt
/dev/sda2 xfs 32G 10G 22G 32% /
awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'
awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%
awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /