awkで重複行を削除する方法

Linux

テキストファイルから重複している行を削除するにはどうしたらいいんだろう?

sumomo_99
sumomo_99

awkを使えば重複行を削除できるよ。

データが記入されているファイルから重複してる行を削除したい場合はありませんか?重複している行はawkを使うことで簡単に削除をすることができます。

本記事ではawkを利用して、ファイル等から重複行を削除する方法を紹介します。

スポンサーリンク

事前準備

以下のような重複行のあるテキストファイルを用意しておきます。

$ cat test.txt
aaa
bbb
aaa
aa
ccc
aa

この例では、’aaa’と’aa’が重複している行になります。

awkで重複行を削除する例

例1) awk ‘!x[$0]++’
$ awk '!x[$0]++' test.txt
aaa
bbb
aa
ccc
例2) awk 'x[$0]++==0'
$ awk 'x[$0]++==0' test.txt
aaa
bbb
aa
ccc

解説

awkの配列(連想配列)を利用します(x[$0])。

$0は入力行になります(aaa, bbb, aaaa, aa ……)。awkの配列の添字は、数値ではなく文字列(この場合はechoで入力された文字列)になります。

x["aaa"]
x["bbb"]
:
:
  • 配列の初期値は「0(ゼロ)」であり、ゼロ(初回の出現時)の場合のみ表示させます。
  • 否定演算子でゼロを真(1)に変えるか、ゼロと比較します。
  • 比較(表示)後、インクリメント(++)で配列の値を加算(+1)します。
  • 次に重複した配列添え字が出現した場合、ゼロ以外の値なので表示されないことになります。

応用編: 1回重複している行を抽出する

逆に、1回重複している行を抽出するにはどうすればよいのでしょうか?

sumomo_99
sumomo_99

配列の値が「1」である行を抽出すれば良いです。

重複していない行は配列の値が「0」、1回重複すると「1」になります。つまり、配列の値が「1」である行を抽出することで1回だけ重複している行を出力することができます。

例3) awk ‘x[$0]++==1’
$ awk 'x[$0]++==1' test.txt
aaa
aa

重複している行だけ出力されました。

以上、awkを利用して、ファイル等から重複行を削除する方法の紹介でした。

タイトルとURLをコピーしました