[Linux] 重複文字列・重複行の除去方法(tr, uniq, awk)

記事内に広告が含まれています。

結論

ファイルから特定の文字列を除去するコマンド

$cat "ファイル名" | tr -d "文字列"  

重複行を除去するコマンド. uniq コマンドはソートされている必要がある.

sort "ファイル名" | uniq "ファイル名" 

重複する文字列の削除方法: tr

例として,以下のように各行に日付があるログを例にしてみます.

$cat sample.txt
[2023-01-01] yamadaさん
[2023-01-01] tanakaさん
[2023-01-01] suzukiさん
[2023-01-01] yamadaさん

このログから人の名前だけを抽出したい場合は以下のコマンドを実行すれば取得できます.

$cat sample.txt | tr -d "[2023-01-01]"
 yamadaさん
 tanakaさん
 suzukiさん
 yamadaさん

重複する行を除去する方法1 : uniq

上のログに記入されている人数を知りたい場合,4行目は不必要です.そういった場合に便利なのが uniq コマンドです.

$sort sample.txt | uniq
[2023-01-01] suzukiさん
[2023-01-01] tanakaさん
[2023-01-01] yamadaさん

$sort sample.txt | uniq | wc -l
3

名前の順に並び替えられた状態で,重複を消して表示されます.また,wc -l コマンドを使うことで,ログに残った人数(=行数)を知ることができます.

重複する行を除去する方法2: awk コマンド

awk コマンドを使うと,並び替えをしないで重複行の除去を実現できます.

$cat sample.txt | awk '!a[$0]++{print}' 
[2023-01-01] yamadaさん
[2023-01-01] tanakaさん
[2023-01-01] suzukiさん

a[ ] が配列を意味しており,$0=各行を意味します.

同じ行がなければインクリメントして表示します.

おまけ: trとuniqを組み合わせてみる

tr と uniq を組み合わせると,ログに残っている人名だけ取り出すことができます.

$cat sample.txt | tr -d "[2023-01-01]*さん" |  sort | uniq 
 suzuki
 tanaka
 yamada

まとめ

liunxコマンドで,重複要素の除去方法についてまとめました.

参考文献です.資格向けですが,Linux の基礎がまとめられていてとても良い本と感じています.

Linux
スポンサーリンク