私はファイルから重複したエントリを削除する "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
$0
awk
a[$0]++
$0
「インデックス」(=現在の入力行の内容)の配列項目を1だけ増やします。!a[$0]
awk
コンテンツの配列エントリがまだゼロの場合にのみ行を印刷するように指示するフィルタルールです(初期化されていない場合は暗黙的に発生します)。!a[$0]++
2本を1行で組み合わせる(別名「コードゴルフ」)
... bashを使用して読みやすくすることもできますalias
。
alias myuniq='awk '\''!a[$0]++'\'
\ありがとう{@AdminBee}