Все, що я хочу, - це надруковані дві останні колонки.
Все, що я хочу, - це надруковані дві останні колонки.
Відповіді:
Ви можете використовувати змінну, 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
Я щойно ставлю гаук на 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)
. Тоді є розділ "Вирази у курсі", в якому вказано $expr
, що має [набагато] перевагу вище expr - expr
. Оскільки NF
це само вираження, $NF-1
слід оцінювати ($NF)-1
. Навіть якщо, зрештою, там дійсно є дивовижні реалізації, які оцінюють $NF-1
як $(NF-1)
, уроки, засвоєні тут, - це те, що використання $(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% /
Спробуйте це, щоб врахувати всі можливі сценарії:
awk '{print $(NF-1)"\t"$NF}' file
або
awk 'BEGIN{OFS="\t"}' file
або
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file