删除非常大的文件中的重复项()

删除非常大的文件中的重复项()

在这个给定的输入文件中,有 4 列。我们必须删除重复项,但有一个问题。存在优先顺序C2>C3>C4。所以在输出中只有一行a, 和 的一行分别为和e1 和 1 。hg

请注意,C1所有a的都合二为一。之后ekefem合二为一。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
}

相关内容