使用 sort 命令对文件进行排序并覆盖它

使用 sort 命令对文件进行排序并覆盖它

我试图对文本文件进行排序,并用原始文件替换排序后的文件,因此我将文件也设置为 sort 命令的输出,但当我这样做时,它会清除文件内容并且文件变为空,为什么?我可以使用另一个文件来解决这个问题,但感觉不太好 :D,(我正在使用 Lubuntu。)

faav@faav-XPS-L501X:~$ cat test
A
C
B
faav@faav-XPS-L501X:~$ ls -l test
-rw-rw-r-- 1 faav faav 6 Apr 14 00:28 test
faav@faav-XPS-L501X:~$ sort test > test
faav@faav-XPS-L501X:~$ cat test
faav@faav-XPS-L501X:~$ ls -l test
-rw-rw-r-- 1 faav faav 0 Apr 14 00:28 test

答案1

使用-o选项sort而不是使用重定向运算符,这将就地编辑文件。

man sort

-o, --output=FILE
              write result to FILE instead of standard output

这是一个测试:

$ cat test.txt 
A
C
B

$ sort test.txt 
A
B
C

$ sort test.txt -o test.txt

$ cat test.txt 
A
B
C

答案2

发生这种情况的原因是,输入/输出文件在实际读取其内容之前被截断,因此sort最终读取一个已经是空的文件。

一般来说(即将命令的输出重定向到其输入文件时,因为此问题不仅发生在sort),您可以在子 shell 中执行所需的命令并将其输出存储到变量中,然后将变量的内容刷新到文件(例如使用echo),这样将输入/输出文件的截断延迟到已经读取输入文件的点:

tmp=$(sort test) && echo "$tmp" >  test

还要注意,对于大文件来说,这不是很有效,并且&&选择了运算符来代替,;以避免在第一个命令失败的情况下截断输入/输出文件。

答案3

你可以这样写排序 -b -o 文件名 文件名,其中 filename 指定两次相同的文件,因为您希望将输出保存或覆盖到原始文件。此命令的工作原理是,它将删除任何空格并对文件内容进行排序并覆盖到原始文件。

然后你可以通过提及来打印文件的内容猫文件名,将文件内容作为输出打印到标准输出设备上。

谢谢。

相关内容