Bash 如何从文件中删除重复项并写入同一文件?
我知道我的标题不太清楚,但让我试着在这里解释一下 我有一个文件名Bash 如何从文件中删除重复项并写入同一文件?,bash,file,sorting,duplicates,in-place,Bash,File,Sorting,Duplicates,In Place,我知道我的标题不太清楚,但让我试着在这里解释一下 我有一个文件名test.txt,其中有一些重复的行。现在,我要做的是删除那些重复的行,同时用新内容更新test.txt test.txt AAAA BBBB AAAA CCCC 我知道我可以使用sort-u test.txt删除重复项,但要用新内容更新文件,我如何将其输出重定向到同一个文件。下面的命令不起作用 sort -u test.txt > test.txt 那么,为什么上面的命令不起作用,正确的方法是什么 还有其他类似的方式吗
test.txt
,其中有一些重复的行。现在,我要做的是删除那些重复的行,同时用新内容更新test.txt
test.txt
AAAA
BBBB
AAAA
CCCC
我知道我可以使用sort-u test.txt
删除重复项,但要用新内容更新文件,我如何将其输出重定向到同一个文件。下面的命令不起作用
sort -u test.txt > test.txt
那么,为什么上面的命令不起作用,正确的方法是什么
还有其他类似的方式吗
sort_and_update_file test.txt
它可以对我的文件进行排序并自动更新,而无需重定向。这可能适用于您:
sort -u -o test.txt test.txt
这并不像看上去那么低效:
sort -u test.txt > test.txt.tmp && mv test.txt.tmp test.txt
当您试图同时从同一文件读写时,shell中的重定向将无法工作。实际上,在执行排序之前,该文件已打开进行写入(
>file.txt
)
@Poton的答案是有效的,因为排序程序本身可能将所有行存储在内存中,我不会依赖它,因为它没有在手册页中明确指定它可以与输入文件相同(尽管它可能会工作)。除非有文件证明可以“就地”工作,否则我不会这样做(@perreal的答案可以工作,或者您可以将中间结果存储在shell内存中)使用海绵读取/写入同一文件
在写入文件之前,可以使用中的海绵实用程序吸收标准输出。这可以防止您随意移动文件,并近似于就地编辑。例如:
sort -u test.txt | sponge test.txt
样本输出
使用语料库,这将产生预期的输出
$ cat test.txt
AAAA
BBBB
CCCC
您可以使用vim就地编辑文件:
$ ex -s +'%!sort' -cxa test.txt
多个文件:
$ ex -s +'bufdo!%!sort' -cxa *.*
谢谢你的回答,但为什么我不能使用排序重定向。这可能还不够,但@potong的答案更简洁明了。这是这个问题的典型答案。安全、可移植、简单且惯用。任何
排序的可能重复项都只能在算法知道所有要排序的条目后才能输出任何内容——无论使用何种算法,都是如此。这意味着只有当不再需要从test.txt
读取时,sort
的输出才会给出,因此我想说,根据定义,输出到同一个文件是安全的…@rody_o,你不能设想在磁盘上运行的排序吗?在“无限记忆”出现之前他们做了什么?没有办法在磁盘上排序吗?我只是不想知道某些东西是如何实现的,如果它被记录为支持“就地”或特别允许同一个文件,那么我相信它,否则,我宁愿在安全方面出错。是的,想想看……对大文件的排序必须在磁盘上完成,我的坏消息。我有一半假设小文件将被读取一次,算法将从内存中执行……因此sort-o
必须对test.txt
进行2N次以上的写入,假设它包含N行,对吗?@rody_o从复杂性的角度来看o(N)==o(2N),所以2N实际上不会那么糟糕,但这意味着您不能使用同一个文件。。。这就是说,关于排序复杂性的讨论已经超出了讨论的范围(我很生疏,自从上大学以来就没有这样做过),但我认为它的方式更糟…@nhed:你们所说的是“外部排序”;维基百科有一个独特的功能。