2016-08-12 7 views
1

テキストファイルから重複したエントリ(行)を削除しようとする小さなシェルスクリプトを作成しました。スクリプトが実行され、ファイルに3行が含まれている場合、すべて同じですが、奇妙な出力が発生します。awk出力をファイルにコピーして重複を削除すると奇妙な出力が発生する

シェルスクリプトはUbuntuディストリビューションで実行されます。私のテキストファイルの

内容:

one 
one 
one 

スクリプト私は重複を削除するために実行しています:

echo -e $(awk '!a[$0]++' /test/test.txt) > /test/test.txt 

のawkは、重複を削除するように意図され、エコーながら、はファイルに出力することを意図しています。私のスクリプト、を実行する際に

I受けるファイルで、次のような出力:

one 
one 

また二行目の後に追加の改行、および開始時にスペースがあることに留意すべきです2行目。

+2

あなたは 'awk '!a [$ 0] ++' /test/test.txt>/test/newtest.txt'だけで十分です。あなたはそれをエコーする必要はありません。また、入力ファイルに[DOS終了点]がないことを確認してください(http://www.cs.toronto.edu/~krueger/csc209h/tut/line-endings.html) – Inian

答えて

0

あなたがそれを読むのと同時にファイルに書き込むと、通常は災害につながります。

あなたはGNU AWKを持っている場合は、-i inplaceオプションを使用します。あなたはBSDのawkを持っている場合は、使用

$ cat text 
one 
one 
one 
$ gawk -i inplace '!a[$0]++' text 
$ cat text 
one 

を:

また
awk '!a[$0]++' text >tmp && mv tmp text 

、あなたがspongeインストールした場合:

awk '!a[$0]++' text | sponge text 

spongeファイルを更新しませんパイプラインが読み込みと処理を終了するまで

関連する問題