410gone.click

©2021 sumomo-99

[awk] 重複行を削除する方法

更新日: 2021-04-11T07:07:00.401Z

awk

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

事前準備

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

$ cat test.txt
aaa
bbb
aaa
aa
ccc
aa

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

awkで重複行を削除する例

awk '!x[$0]++'
または
awk 'x[$0]++==0'
 

実行例

$ awk '!x[$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回重複している行を抽出するにはどうするか?配列の値が「1」である行を抽出すれば良いです。
 
awk 'x[$0]++==1'
 

実行例

$ awk 'x[$0]++==1' test.txt
aaa
aa

重複している行だけ出力されました。
 
以上、awkを利用して、ファイル等から重複行を削除する方法の紹介でした。