如何从文件中删除重复项并写入同一文件?

时间:2012-07-07 13:31:11

标签: bash file sorting duplicates in-place

我知道我的标题不太明确,但让我试着在这里解释一下。

我的文件名test.txt有一些重复的行。现在,我想要做的是删除那些重复的行,同时update test.txt删除新的内容。

的test.txt

AAAA
BBBB
AAAA
CCCC

我知道我可以使用sort -u test.txt删除重复内容但是使用新内容更新文件如何将其输出重定向到同一文件。以下命令不起作用。

sort -u test.txt > test.txt

那么,为什么上面的命令不能正常工作呢?

还有其他方式,如

sort_and_update_file test.txt

可以对文件进行排序和自动更新,而无需重定向。

5 个答案:

答案 0 :(得分:9)

这可能对您有用:

sort -u -o test.txt test.txt

答案 1 :(得分:5)

shell中的重定向将无法正常工作,因为您尝试同时从同一文件读取和写入。实际上,在排序执行之前,文件被打开(> file.txt

@ potong的答案是有效的,因为排序程序本身可能会将所有行存储在内存中,我不会依赖它,因为它没有在联机帮助页中明确指出它可以与输入文件相同(尽管它可能会起作用) )。除非记录为“就地”工作,否则我不会这样做(@ perreal的答案可行,或者你可以将中间结果存储在shell内存中)

答案 2 :(得分:4)

使用海绵读取/写入相同文件

您可以使用moreutils中的 sponge 实用程序在写入文件之前吸收标准输出。这可以防止您不得不随机播放文件,并近似于就地编辑。例如:

sort -u test.txt | sponge test.txt

样本输出

使用您的语料库,这会产生预期的输出。

$ cat test.txt 
AAAA
BBBB
CCCC

答案 3 :(得分:2)

这不像它看起来那么低效:

sort -u test.txt > test.txt.tmp && mv test.txt.tmp test.txt 

答案 4 :(得分:0)

您可以使用vim就地编辑文件:

$ ex -s +'%!sort' -cxa test.txt

多个文件:

$ ex -s +'bufdo!%!sort' -cxa *.*