重複した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
sed
plusを使用してsponge
入力ファイルを安全に上書きできます。これにより、パッケージ(Ubuntu)で利用可能なtotal
入力ファイルとして使用できます。 sponge
moreutils
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 total
total
total
代わりにsponge
、一時ファイルに出力してからtotal
その一時ファイルに置き換えることができます(ただし好みますsponge
)。