在awk中选择行和元素

107

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

4个回答

215

打印第二行:

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

29

要打印包含特定字符串的列,您可以使用 // 搜索模式。例如,如果您要查找包含 abc 的第二列:

awk '$2 ~ /abc/'

... 如果您只想打印特定的列:

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

...并针对特定的行号:

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

26

在Dennis的答案上进行扩展,使用awk-v选项来传递j的值:

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

我们能举个使用 -v 选项会有帮助的例子吗? - Rani Kheir
1
@dessert中的j被填充了值3,因此当它执行print $j时,它实际上是在执行print $3,这将打印第三列,因此当前状态下是正确的。 - Davy M

2

由于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


以下是与 Glenn 解决方案等效的 Perl 代码:

打印第 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 将输入行自动分割成数组 @F,使用空格作为分隔符
-n 循环处理输入文件的每一行
-e 在引号内执行代码
$F[1] 是数组的第二个元素,因为Perl从 0 开始计数
$. 是行号


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接