我知道我的标题不太明确,但让我试着在这里解释一下。
我的文件名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
可以对文件进行排序和自动更新,而无需重定向。
答案 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 *.*