重複を避けるために単語リストに単語を追加するには、sort -uを使用します。

重複を避けるために単語リストに単語を追加するには、sort -uを使用します。

重複したone.txtという2つのtxtファイルがあります。

yesterday
yesterday
today
today
tomorrow
tomorrow

2番目のtxtはtwo.txtと呼ばれ、重複した内容が含まれています。

mike
mike
paul
paul
tomorrow
tomorrow

このコマンドを使用すると、sort -u one.txt > total.txt出力ファイルを取得できます。

today
tomorrow
yesterday

したがって、次のようにsort -u two.txt >> total.txtして、同じ出力ファイルに2番目のファイルを追加しました。

today
tomorrow
yesterday
mike
paul
tomorrow

「明日」という言葉を2回使った。それを避ける方法?

sed 's/[[:space:]]+$//' one.txt two.txt | sort -u total.txt

解決策のように見えますが、次のような別の単語のリストを追加しようとするたびに問題が発生します。

sed 's/[[:space:]]+$//' three.txt | sort -u total.txt

答え1

total.txtソートされた順序(mikeおよびで始まる)に移動するには、paul次のいずれかを実行できます。

  • sort -u one.txt two.txt > total.txtまたは
  • sort -u total.txt two.txt -o total.txt

順序を維持する必要がある場合(one.txt最初にコンテンツをソートしてからコンテンツをソートする)two.txt とは別に)one.txt次に実行

  • sort -u two.txt | awk '!seen[$0]++' total.txt - > temp.txt; mv temp.txt total.txt

これは次のとおりです。

  • (cat total.txt; sort -u two.txt) | awk '!seen[$0]++' > temp.txt; mv temp.txt total.txt

つまり、取得したコンテンツtotal.txt (既に並べ替えと重複排除済み)と並べ替えられ、重複排除されたコンテンツが後で配信されますtwo.txt以前に録音された awkソートされていないファイルを重複排除するコマンド。

答え2

sedplusを使用してsponge入力ファイルを安全に上書きできます。これにより、パッケージ(Ubuntu)で利用可能なtotal入力ファイルとして使用できます。 spongemoreutils

Spongeは標準入力を読み取り、それを指定されたファイルに書き込みます。シェルリダイレクトとは異なり、スポンジは出力ファイルを開く前にすべての入力を吸収します。これにより、同じファイルを読み書きするパイプラインを構築できます。

file[0]=total; [[ -f "$file" ]] || touch "$file"
file[1]=any
file[2]=number 
file[3]=of
file[4]=files
sed 's/[[:space:]]\+$//' "${file[@]}" | sort -u | sponge "$file"

bash var配列の最初の項目は${file[0]}インデックスを使用せずに参照され、対応する値を設定できます。$file(上記のように - 入力する方が簡単です)。まだ終了していない場合は作成されます
。必要な数のファイルを使用できます。それに応じてインデックス番号を増やすだけです。同じファイルセットを再度実行することができ、コンテンツは(そのファイルセットに対して)最初の実行と同じままです。[[ -f total ]] || touch totaltotal

total

代わりにsponge、一時ファイルに出力してからtotalその一時ファイルに置き換えることができます(ただし好みますsponge)。

関連情報