申し訳ありません。クエリを正しく表現していないため、例を修正する必要がありました。 .txtファイルがあるとしましょう。
Happy sad
Happy sad
Happy sad
Sad happy
Happy sad
Happy sad
Mad sad
Mad happy
Mad happy
一意の文字列を削除したいです。ファイルを残してください:
Happy sad
Happy sad
Happy sad
Happy sad
Happy sad
Mad happy
Mad happy
私はソートが重複()を削除できることを知っていますsort file.txt | uniq
。それでは、bashでその逆を実行するためにコマンドを使用できますか?それともwhileループを調べる必要がありますか?ところでuniq -D file.txt > output.txt
動作しません。
ベストアンサー1
使用awk
:
$ awk 'seen[$0]++; seen[$0] == 2' file
Happy sad
Happy sad
Happy sad
Happy sad
Happy sad
Mad happy
Mad happy
これは、各行のテキストを連想配列のキーとして使用しますseen
。最初は、以前に見たseen[$0]++
行が印刷されるようにします。なぜなら、その行に関連付けられた値は、2行目以降の行が表示されたときにゼロではないからです。seen[$0] == 2
その行が2番目に表示されている場合は、その行が再印刷されます(それ以外の場合は、繰り返される各行の1つの項目を見逃す可能性があります)。
awk '!seen[$0]++'
時々使われるのと似ています。 削除するソートせずに繰り返します(例:awk '!a[$0]++' はどのように機能しますか?)。
重複行のコピーを1つだけ取得します。
awk 'seen[$0]++ == 1' file
または、
sort file | uniq -d