特定の数字の検索と並べ替え

特定の数字の検索と並べ替え

ファイル全体で特定の単語(この場合は数字)を見つけてソートし、一度だけ表示されたら削除します。

入力する:

1. I love my country 1234
2. I love Newyork 5678
3. I love my city 1234
4. I love my pet 1111
5. I love my dog 2222
6. I love my cat 1111
7. I love my cat 5555

出力:

1. I love my country 1234
2. I love my city 1234
3. I love my pet 1111
4. I love my cat 1111

試みました:sort -u正しい結果を提供できませんでした。

ベストアンサー1

努力する:

awk '{c[$NF+0]++; a[NR]=$NF+0; b[NR]=$0} END{for(i=1;i<=NR;i++)if(c[a[i]]>1)print b[i]}' file

入力ファイルを使用してください。

$ cat file
I love my country 1234
I love Newyork 5678
I love my city 1234
I love my pet 1111
I love my dog 2222
I love my cat 1111
I love my cat 5555

上記のコマンドは以下を生成します。

$ awk '{c[$NF+0]++; a[NR]=$NF+0; b[NR]=$0} END{for(i=1;i<=NR;i++)if(c[a[i]]>1)print b[i]}' file
I love my country 1234
I love my city 1234
I love my pet 1111
I love my cat 1111

複数行バージョン

複数行にわたってコマンドを分散したい場合:

awk '
    {
        c[$NF+0]++
        a[NR]=$NF+0
        b[NR]=$0
    }
    END{
        for(i=1; i<=NR; i++)
            if (c[a[i]]>1)
                print b[i]
    }
    ' file

今大丈夫

  • c[$NF+0]++

    配列は、cファイルの各行の最後のフィールドに複数回表示される数字を追跡します。

  • a[NR]=$NF+0

    配列は行a番号キーの下の行の最後のフィールドに数字を格納しますNR

  • b[NR]=$0

    行番号の場合、配列NRは行bを保存します。

  • END{for(i=1;i<=NR;i++)if(c[a[i]]>1)print b[i]}

    ファイルの終わりに達したら、各行をもう一度繰り返し、行cの数字(から提供a)が1より大きい場合は行を印刷します。

おすすめ記事