매우 큰 파일에서 중복 제거()

매우 큰 파일에서 중복 제거()

이 입력 파일에는 4개의 열이 있습니다. 중복된 항목을 제거해야 하는데 문제가 있습니다. 우선순위는 C2>C3>C4입니다. 따라서 출력에는 단 하나의 행 , 즉 a각각 e1과 1에 대한 행이 있습니다.hg

모두 C1하나로 a통합되었습니다. 이후 둘은 ek하나로 합쳐졌다. 그리고 그것은 별개입니다.efemhg

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]++'이러한 열이 제거된 중복 행만 제공됩니다. 전체 파일(모든 열)의 중복을 제거하고 싶습니다. 또한 또 다른 제한 사항이 있습니다. 파일 크기는 최대 200GB까지 가능합니다. 따라서 열을 삭제하는 것은 충분한 접근 방식이 아닌 것 같습니다.

저는 리눅스를 사용하고 있습니다.

답변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
}

관련 정보