Awk - 根据不同行中不同元素的条件,有条件地从某行打印元素

时间:2017-09-09 04:27:10

标签: 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}'

3 个答案:

答案 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

标志fgvt不同,以防其中任何一个为空("")。