10

我知道我的标题不言自明,但让我在这里尝试解释一下。

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

测试.txt

AAAA
BBBB
AAAA
CCCC

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

sort -u test.txt > test.txt

那么,为什么上面的命令不起作用,正确的方法是什么?

还有其他方法吗

sort_and_update_file test.txt

无需重定向即可对我的文件进行排序并自动更新。

4

5 回答 5

12

这可能对您有用:

sort -u -o test.txt test.txt
于 2012-07-07T13:37:33.747 回答
5

当您尝试同时从同一个文件中读取和写入时,shell 中的重定向将不起作用。> file.txt实际上,在执行排序之前文件已打开以写入 ( )

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

于 2012-07-07T13:46:44.857 回答
4

使用 Sponge 读取/写入同一文件

您可以使用moreutils中的海绵实用程序在写入文件之前吸收标准输出。这可以防止您必须四处打乱文件,并近似于就地编辑。例如:

sort -u test.txt | sponge test.txt

样本输出

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

$ cat test.txt 
AAAA
BBBB
CCCC
于 2012-07-07T14:37:08.700 回答
2

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

sort -u test.txt > test.txt.tmp && mv test.txt.tmp test.txt 
于 2012-07-07T13:39:00.117 回答
0

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

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

多个文件:

$ ex -s +'bufdo!%!sort' -cxa *.*
于 2015-04-19T22:28:23.697 回答