假设我有很多具有一致数量的列和行的文件,示例如下:
1 2 3
4 5 6
7 8 9
我想打印第2行的第3列,但仅当第3行的第3列== 4时(在这种情况下它是9)。我使用这种逻辑是一种确定文件是否对我的用例有效的方法,如果是,则提取相关字段。
根据人们询问如何隔离某些行的其他答案,我的尝试是:awk 'BEGIN{FNR=3} $3=="4"{FNR=2;print $2}'
答案 0 :(得分:3)
所以你正在寻找这样的东西?
awk 'FNR==2{ x = $3 }FNR==3 && $3=="4"{ print x }' file.txt
cat file.txt
1 2 3
4 5 6
7 8 4
输出:
6
cat file.txt
1 2 3
4 5 6
7 8 9
输出:
第3行第3列的内容为9
答案 1 :(得分:1)
awk 'FNR==3 && $3==4{print p} {p=$3}' *
答案 2 :(得分:1)
这是另一个不关心记录出现顺序的。在OP中,问题是根据第3条记录上的测试值(v
)从第2条记录中打印一个值(t
)。此解决方案允许测试值出现在比要打印的值更早的记录中:
$ awk '
FNR==2 { # record on which is the value to print
v=$3
f=1 # flag indicating the value v has been read
}
FNR==3 { # record of which is the value to test
t=$3
g=1 # test value read indicator
}
f && g { # once the value and test value are acquired and
if(t==4) # test the test
print v # output
exit # and exit
}' file
6
记录顺序颠倒(代码中FNR
值已更改):
$ cat file2
1 2 3
7 8 4 # records
4 5 6 # reversed
$ awk 'FNR==3{v=$3;f=1}FNR==2{t=$3;g=1}f&&g{if(t==4)print v;exit}' file2
6
标志f
和g
与v
和t
不同,以防其中任何一个为空(""
)。