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
,如果两者都应该为空(