我了解到在awk中,$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 }'
在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}'
由于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
开始计数
$.
是行号
j
被填充了值3
,因此当它执行print $j
时,它实际上是在执行print $3
,这将打印第三列,因此当前状态下是正确的。 - Davy M