我有一个像这样的两列文件(第二列已排序):
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”的行。
最好
使用 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