Я дізнався, що в awk $2
- це 2-а колонка. Як вказати i-й рядок та елемент у i-му рядку та j-му стовпці?
Відповіді:
Щоб надрукувати другий рядок:
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}'
Для друку стовпців із певним рядком використовується шаблон пошуку //. Наприклад, якщо ви шукаєте другі стовпці, що містять abc:
awk '$2 ~ /abc/'
... а якщо ви хочете надрукувати лише певний стовпець:
awk '$2 ~ /abc/ { print $3 }'
... і для певного номера рядка:
awk '$2 ~ /abc/ && FNR == 5 { print $3 }'
Щоб розширити відповідь Денніса, скористайтесь опцією 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}'
j
заповнюється значенням 3
, тому, коли він робить, print $j
це робить, print $3
що друкує третій стовпець, тому він правильний, як він є.
Оскільки 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
$.
- це рядок номер