앗, 중복된 값 ​​[중복]

앗, 중복된 값 ​​[중복]

두 번 반복되는 매개변수 집합을 기반으로 중복된 값을 반환하는 스크립트를 작성하려고 합니다. 예를 들어 내 텍스트 파일에는 다음과 같은 설정이 있습니다.

SPPARK|6543|M1122|6543|Hendrick|Brian|1977/11/09||
SPPARK|1245|M3344|6543|Hendrick|Brian|1977/11/09||

이제 성, 이름, 생년월일이 반복되면 해당 두 행을 반환하고 계속 진행하고 싶습니다.이렇게 하는 것은 가능하지만 제대로 작동하지 않는 것 같습니다.

awk '!seen[$4,$5]++ > 1' DemoDATA.txt

답변1

awk '!seen[$4, $5]++ > 1' DemoDATA.txt

파일의 필드가 로 구분되어 있고 |성 및 생년월일을 확인해야 하는 필드가 필드 5, 6, 7이라는 점을 제외하면 거의 정확합니다. 또한 1과 비교할 필요도 없습니다(왜 그렇게 하는지 이해할 수 있지만 비교는 결코 사실이 아닙니다).

옳은:

awk -F '|' '!seen[$5, $6, $7]++' DemoDATA.txt

그러나 이렇게 하면 원본 행이 아닌 중복된 행만 출력됩니다. 이렇게 하려면 구문 분석하는 동안 전체 파일을 메모리에 유지해야 합니다.

...그게 "에 대한 대답이에요특정 열에 중복된 값이 있는 파일의 모든 행을 인쇄하는 방법“그 일을 하는 것(또는 그들이 똑똑하다면 그것을 하지 않는 것, 그들 중 일부는 그렇습니다).

답변2

Kusalananda가 제안한 대로 전체 파일을 메모리에 보관하십시오.

awk -F'|' '
    {
        key = $5 FS $6 FS $7
        count[key]++
        data[key] = data[key] (count[key] == 1 ? "" : ORS) $0
    }
    END { for (key in count) if (count[key] > 1) print data[key] }
' DemoDATA.txt

또는

perl -F'\|' -ane '
        $key = join "|", @F[4..6];
        push @{$data{$key}}, $_;
    } END {
        print @{$data{$_}} for grep {@{$data{$_}} > 1} keys %data;
' DemoDATA.txt

관련 정보