回显awk输出到文件以删除重复项有奇怪的输出

时间:2016-08-12 03:16:52

标签: bash shell awk sh

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

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

我的文字内容:

one
one
one

我正在运行的脚本删除重复项:

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

awk 旨在删除重复项,而 echo 旨在将其输出到文件中。

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

one
 one

还应该注意,第二行后面还有一个换行符,第二行开头有一个空格。

1 个答案:

答案 0 :(得分: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在管道完成读取和处理之前不会更新文件。