Виділіть рядок та елемент у awk


81

Я дізнався, що в awk $2- це 2-а колонка. Як вказати i-й рядок та елемент у i-му рядку та j-му стовпці?

Відповіді:


168

Щоб надрукувати другий рядок:

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}'

27

Для друку стовпців із певним рядком використовується шаблон пошуку //. Наприклад, якщо ви шукаєте другі стовпці, що містять abc:

awk '$2 ~ /abc/'

... а якщо ви хочете надрукувати лише певний стовпець:

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

... і для певного номера рядка:

awk '$2 ~ /abc/ && FNR == 5 { print $3 }'

25

Щоб розширити відповідь Денніса, скористайтесь опцією 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}'

Чи можемо ми мати приклад того, коли використання параметра -v було б корисним?
Рані Хейр,

1
@dessert the jзаповнюється значенням 3, тому, коли він робить, print $jце робить, print $3що друкує третій стовпець, тому він правильний, як він є.
Davy M

1

Оскільки awk і perl тісно пов'язані ...


Perl-еквіваленти рішень @ Dennis's 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
$.- це рядок номер

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.