ファイルにリダイレクトする前に重複エントリを削除する方法

ファイルにリダイレクトする前に重複エントリを削除する方法

私はファイルから重複したエントリを削除する "uniq"コマンドを見ましたが、ファイルを保存する前に重複した出力を削除することを目的としています。

#!/bin/sh
echo "aaa"
echo "bbb"
echo "aaa"
echo "aaa"
echo "bbb"
echo "ccc"

私が望む出力は

aaa
bbb
ccc

その後、テキストファイルにリダイレクト

大丈夫ですか?ありがとうございます。

答え1

uniqソートされた入力にのみ適用されます。

./my_script.sh | sort -u > output_file

本質的に同じ

./my_script.sh | sort | uniq > output_file

答え2

awk '!a[$0]++'ソートされていない重複行を削除し、元の順序を維持する簡単な方法です。

これを使用して、たとえば、次の操作を実行できます。

  • フィルタ出力:./my_script |awk '!a[$0]++' > output
  • フィルタスクリプト:awk '!a[$0]++' my_script > new_script
  • スクリプトをフィルタリングして実行します。awk '!a[$0]++' my_script | sh > output
  • vim私のフィルタ::%!awk '\!a[$0]++'

その後のアイデアは、発生回数を配列に保存して見つかったパターンを追跡し、その特定の内容a(inで示される)の値がまだゼロの場合にのみその行を印刷することです。だから、a$0awk

  • a[$0]++$0「インデックス」(=現在の入力行の内容)の配列項目を1だけ増やします。
  • !a[$0]awkコンテンツの配列エントリがまだゼロの場合にのみ行を印刷するように指示するフィルタルールです(初期化されていない場合は暗黙的に発生します)。
  • !a[$0]++2本を1行で組み合わせる(別名「コードゴルフ」)

... bashを使用して読みやすくすることもできますalias

alias myuniq='awk '\''!a[$0]++'\'


\ありがとう{@AdminBee}

関連情報