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

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
配列の値が「1」である行を抽出すれば良いです。
重複していない行は配列の値が「0」、1回重複すると「1」になります。つまり、配列の値が「1」である行を抽出することで1回だけ重複している行を出力することができます。
例3) awk ‘x[$0]++==1’
$ awk 'x[$0]++==1' test.txt
aaa
aa
重複している行だけ出力されました。
以上、awkを利用して、ファイル等から重複行を削除する方法の紹介でした。