ファイル全体で特定の単語(この場合は数字)を見つけてソートし、一度だけ表示されたら削除します。
入力する:
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より大きい場合は行を印刷します。