Awk-根据不同行中不同元素的条件,有条件地打印特定行中的元素
假设我有很多列数和行数一致的文件,其中一个示例如下所示:Awk-根据不同行中不同元素的条件,有条件地打印特定行中的元素,awk,Awk,假设我有很多列数和行数一致的文件,其中一个示例如下所示: 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}'那么您正在寻找类似的东西 awk 'FNR==2{ x = $3 }FNR==3 && $3=="4"{ p
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}'
那么您正在寻找类似的东西
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
1 2 3
4 5 6
7 8 9
输出:
6
cat file.txt
1 2 3
4 5 6
7 8 4
1 2 3
4 5 6
7 8 9
输出:
6
因为第3行的第3列是9,这里还有一个不关心记录显示顺序的。在OP中,问题是根据第三条记录上的测试值(
t
)从第二条记录打印一个值(v
)。此解决方案允许测试值出现在比要打印的值更早的记录中:
awk 'FNR==3 && $3==4{print p} {p=$3}' *
$ 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
代码中更改的值):
标志f
和g
不同于v
和t
,如果两者都应该为空(”
)