awkを使用して重複エントリのみを作成する

awkを使用して重複エントリのみを作成する

awk を使用して重複するアイテムを削除するのは非常に一般的で簡単です。ただし、1つの列のみを比較する場合は、重複した行のみを印刷する必要があります。私は次のコマンドを試しました。

awk 'seen[$2]++'

しかし、ご覧のように欠陥があります。重複した内容は印刷されますが、2回目以降にのみ印刷されます。私はちょうどunixとbashに慣れ始めましたが、解決策を私に説明していただきありがとうございます。

ベストアンサー1

これを行う2つの方法があります。

  1. ファイルを2回繰り返します。

    最初の繰り返しでは、各$ 2の発生回数を数えます。
    2回目の反復では、数が1より大きい行だけが印刷されます。

    awk 'NR == FNR {count[$2]++; next} count[$2] > 1' file file
    
  2. データの単一反復:

    $2が表示される回数を数える必要があります。そして$2ごとにどの行が発生したかを覚えておいてください。

    この答えは、GNU awkを使用して配列の配列を表します。出力順序は入力データと同じにすることはできません。また、ファイル全体をメモリに保存する必要があります。

    gawk '
        { lines[$2][++count[$2]] = $0 }
        END {
            for (x in lines)
                if (count[x] > 1)
                    for (i=1; i<=count[x]; i++)
                        print lines[x][i]
        }
    ' file
    

入力ファイルを使用してテストします。

$ cat file
a b
b b
c b
a c
a d
b d
a e

と予想出力

a b
b b
c b
a d
b d

おすすめ記事