我试图将第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
我还尝试了它,首先只打印重复的行,然后比较相关的值。 我无法弄清楚如何比较与同一字符串相关的值。
答案 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