열 2가 있으면 중복 행을 삭제합니다.

열 2가 있으면 중복 행을 삭제합니다.

저는 다음과 유사한 10,000개가 넘는 행의 샘플 데이터를 사용하여 작업하고 있습니다.

hxxp://google.com 
hxxp://google.com "Seen"
hxxp://yahoo.com "Check again"
hxxp://yahoo.com 
hxxp://about.com
hxxp://x.com
hxxp://y.com
hxxp://z.com
hxxp://reddit.com
hxxp://a.com "good"
hxxp://a.com
hxxp://b.com "good"
hxxp://c.com
hxxp://c.com "good"
hxxp://c.com

나는 이러한 결과를 달성하는 방법을 찾기 위해 고심해 왔습니다.

hxxp://google.com "Seen"
hxxp://yahoo.com "Check again"
hxxp://about.com
hxxp://x.com
hxxp://y.com
hxxp://z.com
hxxp://reddit.com
hxxp://a.com "good"
hxxp://b.com "good"
hxxp://c.com "good"

샘플 데이터에는 중복된 행이 있을 수 있습니다. 중복된 행이 있는 경우 두 번째 열이 누락된 행을 삭제합니다. 구분 기호는 공백입니다.

awk -F' ' '!seen[$1]++' dupe.txt > clean.txt

이건 나에게 딱 맞는 안감은 아닌 것 같다.

답변1

$ LC_ALL=C sort -r <file | LC_ALL=C sort -k1,1 -us
hxxp://a.com "good"
hxxp://about.com
hxxp://b.com "good"
hxxp://c.com "good"
hxxp://google.com "Seen"
hxxp://reddit.com
hxxp://x.com
hxxp://y.com
hxxp://yahoo.com "Check again"
hxxp://z.com

첫 번째는 sort전체 줄을 정렬 키로 사용하여 파일을 역순으로 정렬합니다. 이렇게 하면 중간 결과가 생성됩니다.

hxxp://z.com
hxxp://yahoo.com "Check again"
hxxp://yahoo.com
hxxp://y.com
hxxp://x.com
hxxp://reddit.com
hxxp://google.com "Seen"
hxxp://google.com
hxxp://c.com "good"
hxxp://c.com
hxxp://c.com
hxxp://b.com "good"
hxxp://about.com
hxxp://a.com "good"
hxxp://a.com

주어진 샘플 데이터. 추가 주석이 포함된 줄은 항상 추가 주석이 없는 해당 줄보다 앞에 있다는 점에 유의하세요.

두 번째는 sort고유한 정렬 키가 있는 행만 생성합니다. 첫 번째 필드(URL)만 정렬 키로 사용합니다. 또한 sort"안정적인" 정렬 알고리즘을 사용해야 합니다 -s. 이는 동일한 키를 가진 행의 순서가 입력 순서를 변경하지 않음을 의미합니다.

-u조합은 -s중복된 URL이 포함된 추가 주석 행만 제공합니다.

이 비트는 적절한 로케일을 확보하여 행이 제대로 작동하도록 올바르게 정렬되도록 하기 LC_ALL=C위한 것입니다 .sort

답변2

샘플에 모든 상태가 포함되어 있고 파일 이름이 Sample.data라고 가정하는 경우:

grep " " Sample.data > Result
cut -d' ' -f1 Result > FirstCol
grep Sample.data -v -f FirstCol >> Result

답변3

다음을 수행할 수 있습니다.

awk '
    !($1 in a) || NF > 1 {a[$1] = $0} 
    END {for (url in a) print a[url]}
' dupe.txt

행의 순서는 유지되지 않습니다.

이렇게 하면 순서가 유지되지만 파일을 2번 통과해야 합니다.

awk '
    NR == FNR {
        if (!($1 in a) || NF > 1) {a[$1] = $0} 
        next
    }
    $0 == a[$1]
' dupe.txt dupe.txt

답변4

perl -lane '
    push @h, $F[0] if ! exists $h{$F[0]};
    $h{$F[0]} = $_ if ! exists $h{$F[0]} || @F > 1;
    }{ print $h{$_} for @h;
' dupe.txt > clean.txt

설명하다:

  • @h키(즉, 첫 번째 필드)가 나타나는 순서를 저장합니다.
  • %h은 첫 번째 필드의 해시 값이고 $F[0]해당 값은 toto의 행입니다.
  • %h해시는 새 키를 볼 때마다 업데이트되거나 이전 키를 볼 때 행에 여러 필드가 있을 때 업데이트됩니다. 이 경우 업데이트할 시기가 무르익었습니다.
  • 에서는 eof단순히 배열에 저장된 키를 반복 @h하고 해당 값을 추출하여 표준 출력으로 보냅니다.

산출:

xxp://google.com "Seen"
hxxp://yahoo.com "Check again"
hxxp://about.com
hxxp://x.com
hxxp://y.com
hxxp://z.com
hxxp://reddit.com
hxxp://a.com "good"
hxxp://b.com "good"
hxxp://c.com "good"

관련 정보