在这个给定的输入文件中,有 4 列。我们必须删除重复项,但有一个问题。存在优先顺序C2>C3>C4。所以在输出中只有一行a
, 和 的一行分别为和e
1 和 1 。h
g
请注意,C1
所有a
的都合二为一。之后ek
,ef
又em
合二为一。h
并且g
是分开的。
C1 C2 C3 C4
t a b c
t a b d
t a e
t e k
t a i
t e f
t e m
t h
t g
Output:
t a b c
t e k
t h
t g
我尝试过以下命令:
awk '!seen[$2]++' ac.txt
我的问题:C2 C3 和 C4 之间有很多列。我尝试过,
awk -F$'\t' '{ print $13 " " $18 " " $1 }' originalFile | awk '!seen[$2]++'
但这些只给我删除了这些列的重复行。我想要对整个文件(所有列)进行重复数据删除。此外,还有另一个限制:文件大小最多可达 200 GB。因此,删除列似乎不是一个足够好的方法。
我正在使用Linux。
答案1
这会将“0”列视为空列,但给出的想法更简单:
awk 'A[$c2] + B[$c3] + C[$c4]==0;
c2{A[$c2]++; next} c3{B[$c3]++;next} c4 {C[$c4]++}
' c2=2 c3=3 c4=4 input
(将 c2、c3 和 c4 设置为您关心的实际列号)
要将其扩展到您的案例,您应该能够使用:
awk 'A[$c2] + B[$c3] + C[$c4]==0;
match($c2,"[^ ]"){A[$c2]++; next}
match($c3,"[^ ]"){B[$c3]++;next}
match($c4,"[^ ]"){C[$c4]++}
' FS=\\t c2=2 c3=3 c4=4 input
答案2
这个怎么样(保存到文件并运行)
#!/usr/bin/gawk -f
BEGIN {
FS="\t"
OFS="\t"
}
FNR==1 {
next
}
($2 ~ /.+/ && a[$2]++) {
next
}
($3 ~ /.+/ && a[$3]++) {
next
}
($4 ~ /.+/ && a[$4]++) {
next
}
{
print $0
}