выберите строку и элемент в awk - PullRequest
59 голосов
/ 02 октября 2009

Я узнал, что в awk $ 2 - это второй столбец. Как указать i-ю строку и элемент в i-й строке и j-м столбце?

Ответы [ 5 ]

133 голосов
/ 02 октября 2009

Для печати второй строки:

awk 'FNR == 2 {print}'

Для печати второго поля:

awk '{print $2}'

Для печати третьего поля пятой строки:

awk 'FNR == 5 {print $3}'

Вот пример со строкой заголовка и (избыточными) описаниями полей:

awk 'BEGIN {print "Name\t\tAge"}  FNR == 5 {print "Name: "$3"\tAge: "$2}'

Между прочим, есть лучшие способы выравнивания столбцов, чем "\ t \ t".

Используйте exit, чтобы остановить, как только вы напечатаете нужную запись, если нет причин обрабатывать весь файл:

awk 'FNR == 2 {print; exit}'
26 голосов
/ 03 октября 2009

Чтобы напечатать столбцы с определенной строкой, вы используете // шаблон поиска. Например, если вы ищете вторые столбцы, содержащие abc:

awk '$2 ~ /abc/'

... и если вы хотите напечатать только определенный столбец:

awk '$2 ~ /abc/ { print $3 }'

... и для определенного номера строки:

awk '$2 ~ /abc/ && FNR == 5 { print $3 }'
22 голосов
/ 02 октября 2009

Чтобы расширить ответ Денниса, используйте параметр awk -v, чтобы передать значения i и j:

# print the j'th field of the i'th line
awk -v i=5 -v j=3 'FNR == i {print $j}'
0 голосов
/ 27 июля 2016

Я нашел эту рабочую команду

root @ gateway: / home / sshuser # aws ec2 описывает-экземпляры --instance-id i-2db0459d | grep 'STATE \ | TAG' | awk 'FNR == 1 {print $ 1}'

STATE

0 голосов
/ 03 ноября 2015

Поскольку awk и perl тесно связаны ...


Эквиваленты Perl @ awk-решений Денниса:

Для печати второй строки:
perl -ne 'print if $. == 2' file

Для печати второго поля:
perl -lane 'print $F[1]' file

Для печати третьего поля пятой строки:
perl -lane 'print $F[2] if $. == 5' file


Perl-эквивалент решения @ Glenn:

Печать j-го поля i-й строки

perl -lanse 'print $F[$j-1] if $. == $i' -- -i=5 -j=3 file


Perl-эквиваленты решений @ Hai:

если вы ищете вторые столбцы, содержащие abc:

perl -lane 'print if $F[1] =~ /abc/' foo

... и если вы хотите напечатать только определенный столбец:

perl -lane 'print $F[2] if $F[1] =~ /abc/' foo

... и для определенного номера строки:

perl -lane 'print $F[2] if $F[1] =~ /abc/ && $. == 5' foo


-l удаляет новые строки и добавляет их обратно при печати
-a автоматически разбивает строку ввода на массив @F, используя пробел в качестве разделителя
-n цикл над каждой строкой входного файла
-e выполнить код в кавычках
$F[1] является вторым элементом массива, поскольку Perl начинается с 0
$. это номер строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...