根据两列值打印行

问题描述 投票:0回答:1

我有一个像这样的两列文件(第二列已排序):

m       8569
=       8569
u       8569
j       8569
=       8570
m       8570
j       8570
c       8570
j       8571
j       8572
j       8573
n       8573
=       8573
m       8573
c       8573
u       8574
u       8574

我需要打印 col1 中的值为 "u" 的行,但前提是该值与 col2 中的所有相同值相关联。我应该得到:

u       8574
u       8574

例如,这在这里不起作用,因为“u”值与“8569”值相关联,但还有“m”、“=”和“j”值:

m       8569
=       8569
u       8569
j       8569

我尝试获取每行出现的次数(这简化了文件的其余部分,每次出现仅一行,但问题归结为同一件事):

gawk -F $'\t' '{a[$1][$2]++} END {for (i in a) for (j in a[i]) print i, j, a[i][j]}' file.txt |\
sort -k2V

c PB.8569  1
j PB.8569  1
m PB.8569  1
= PB.8569  1
c PB.8570  1
j PB.8570  1
m PB.8570  1
= PB.8570  1
j PB.8571  1
j PB.8572  1
c PB.8573  1
j PB.8573  1
m PB.8573  1
n PB.8573  1
= PB.8573  1
j PB.8574  1
= PB.8574  1

我也尝试处理这个问题(awk group by 并打印如果匹配条件),但我无法获取匹配only字符“u”的行。

最好

awk
1个回答
0
投票

使用 GNU awk 处理数组的数组

gawk '
    { data[$2][$1][NR] = $0 }
    END {
        for (val in data)
            if ("u" in data[val] && length(data[val]) == 1)
                for (nr in data[val]["u"])
                    print data[val]["u"][nr]
    }
' file

输出

u   8574
u   8574

但是如果您只需要打印唯一的实例,我们可以节省一些内存

gawk '
    { data[$2][$1] = 1 }
    END {
        OFS = "\t"
        for (val in data)
            if ("u" in data[val] && length(data[val]) == 1)
                print "u", val
    }
' file
© www.soinside.com 2019 - 2024. All rights reserved.