选择awk中的行和元素


78

我在awk中了解到,这$2是第二列。如何指定第i行和第i行第j列的元素?

Answers:


164

要打印第二行:

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

24

要扩展Dennis的答案,请使用awk-v选项传递ij值:

# print the j'th field of the i'th line
awk -v i=5 -v j=3 'FNR == i {print $j}'

我们可以举一个使用-v选项何时会有所帮助的示例吗?
拉尼·凯尔

1
@dessertj用值填充3,因此在print $j执行时print $3正在打印第三列,因此它是正确的。
戴维M

1

由于awk和perl密切相关...


@Dennis的awk解决方案的Perl等效项:

要打印第二行:
perl -ne 'print if $. == 2' file

要打印第二个字段:
perl -lane 'print $F[1]' file

要打印第五行的第三个字段:
perl -lane 'print $F[2] if $. == 5' file


Perl相当于@Glenn解决方案:

打印第i行的第j个字段

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


@Hai解决方案的Perl等效项:

如果要查找包含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时将输入行自动拆分为array时添加换行符,@F使用空格作为
-n输入文件每一行的定界符循环
-e执行引号内的代码
$F[1]是数组的第二个元素,因为Perl从0
$.该行开始数

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.