이 입력 파일에는 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]++'
이러한 열이 제거된 중복 행만 제공됩니다. 전체 파일(모든 열)의 중복을 제거하고 싶습니다. 또한 또 다른 제한 사항이 있습니다. 파일 크기는 최대 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
}