2016-08-12 64 views
1

我做了一个小的shell脚本,试图从文本文件中删除重复的条目(行)。当脚本运行并且文件有三行,全部相同时,会发生奇怪的输出。回声awk输出到文件删除重复项有奇怪的输出

shell脚本在Ubuntu发行版上运行。

我的文本文件的内容:

one 
one 
one 

脚本我正在删除重复:

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

AWK打算删除重复的,而回声旨在将其输出到文件。

在运行我的剧本,我收到文件以下输出:

one 
one 

还应当指出的是,在第二行后附加的换行,并在开始时的空间第二行。

+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选项:

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

如果你有BSD AWK,然后使用:

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

或者,如果您已经安装了sponge

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

sponge不更新文件直到流水线完成读取和处理。