あっ、重複した値[重複]

あっ、重複した値[重複]

2回繰り返される一連のパラメータに基づいて重複した値を返すスクリプトを作成しようとしています。たとえば、私のテキストファイルには次の設定があります。

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

今、姓、名前、生年月日が繰り返されたら、その2行を返し、続行したいと思います。アッこれは可能ですが、うまく機能しないようです。

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

関連情報