次のようなファイルがあるとしましょう。
foo1
bar
foo2
foo2
bar
bar
bar
foo3
私はそれを次のように減らしたいと思います:
foo1
bar
foo2
bar
foo3
デフォルトでは、隣接する場合にのみ重複エントリを削除します... bash関数の作成を開始しましたが、これを行う方法がわからないことに気づきました。
remove_duplicate_adjacent_lines(){
prev='';
while read line; do
if test "$line" != "$prev"; then
prev="$line";
echo "$line"
fi
done;
}
しかし、問題はprev
whileループの範囲外です。 bashを使ってこれを行う方法はありますか?
答え1
これがまさにこのuniq
ユーティリティの目的です。
$ uniq <File
foo1
bar
foo2
bar
foo3
bashの記録は良い例です。
history | uniq
上記のコードは行番号のため動作しませんが、次のように動作します。
cat ~/.bash_history | uniq
重複した隣接コマンドが削除されます。
からman uniq
:
フィルター隣接する一致線INPUT(または標準入力)からOUTPUT(または標準出力)を書き込みます。オプションがない場合、一致する行は最初の項目にマージされます。 [強調追加]