比较与相同字符串关联的值

时间:2017-06-08 11:49:23

标签: perl shell unix awk

我试图将第2列中的值与第3列中的值进行比较。比较不在同一行的第2列和第3列中的值之间。 比较的条件是:

(1)当这些行在第1列中具有相同的字符串时,将一行中col2中的值与另一行中第3列中的值进行比较。

(2)仅当第1列中的字符串重复至少两次时进行比较。

(3)第2列中的值大于第3列中不同行中的值,当两行在第1列中具有相同的字符串时。

示例输入文件是:

john    0   100
john    120 200
smith   1   400
claris  300 500
claris  510 700
claris  300 500
dexter  10  400
dexter  100 300
sam 200 300
sam 310 500
tom 100 300
bruce   200 500
bruce   520 900

期望的输出

john    0   100
john    120 200
claris  300 500
claris  510 700
claris  300 500
sam 200 300
sam 310 500
bruce   200 500
bruce   520 900

不打印col1中带'dexter'的行。 'dexter'存在于两行中,但col 2中的值小于col3中其他行中的值,即10小于300且100小于400.而打印'bruce'的行是因为;因为布鲁斯的第2行在col 2中有520,在另一行的col3中大于500。

我用awk试了一下,下面是一个例子。看起来我无法弄清楚将col2与col3在另一行中进行比较,这些行在col1中具有相同的字符串

awk -F "\t" 'NR==FNR{a[$1]++; b[$1]=$2; c[$1]=$3;next}   {for (i in b) if (a[$1] >2 && b[i]>c[i] ) print}' test.file test.file 

我还尝试了它,首先只打印重复的行,然后比较相关的值。 我无法弄清楚如何比较与同一字符串相关的值。

1 个答案:

答案 0 :(得分:1)

正如您在尝试中所做的那样,我们对文件进行了两次传递。在第一个中,我们捕获每个人的出现次数以及column_2的最大值和column_3的最小值。对于第二遍,我们只需测试给定的打印条件。

NR == FNR {
    if (a[$1]) {
        # we've seen this value before in column_1
        # update the min and max values if necessary
        if ($2 > col2max[$1]) col2max[$1] = $2
        if ($3 < col3min[$1]) col3min[$1] = $3
    }
    else {
        # first time we've seen this value in column_1
        # initial the min and max to the current values
        col2max[$1] = $2
        col3min[$1] = $3
    }
    ++a[$1]
    next
}
a[$1] > 1 && col2max[$1] > col3min[$1]

输出:

$ awk -f a.awk file file
john    0   100
john    120 200
claris  300 500
claris  510 700
claris  300 500
sam 200 300
sam 310 500
bruce   200 500