Grz*_*cki 108 text-processing sort
我是盲人还是没有类似的--in-place选择sort?
为了将结果保存到输入文件,sed 使用-i( --in-place)。
将输出重定向sort到输入文件
sort < f > f
Run Code Online (Sandbox Code Playgroud)
导致它为空。如果没有--in-place选择 - 也许有一些技巧可以方便地做到这一点?
(我唯一想到的是:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
Run Code Online (Sandbox Code Playgroud)
移动不是正确的选择,因为可能会更改文件权限。这就是为什么我用临时文件的内容覆盖,然后将其删除。)
enz*_*tib 152
sort有-o(or --output) 选项将文件名作为参数。程序将数据写入临时文件,然后在排序完成后覆盖原始输入文件(只有在读取所有输入数据后才会发生这种情况)。(这与sed -i所做的事情本质上是一样的。)
从GNU sort信息页面:
-o OUTPUT-FILE
--output=OUTPUT-FILEsort在打开OUTPUT-FILE之前读取所有输入,因此您可以使用sort -o F F
和 之类的命令安全地对文件进行排序cat F | sort -o F。但是,sort使用--merge( -m) 可以在读取所有输入之前打开输出文件,因此像这样的命令cat F | sort -m -o F - G是不安全的,因为sort可能会F在cat读取完成之前开始写入。
在较新的系统上,-o如果POSIXLY_CORRECT设置了,则不能出现在输入文件之后
,例如sort F -o F. 可移植脚本应
在任何输入文件之前指定。-o OUTPUT-FILE
-o outputsort,如果您的磁盘空间不足或磁盘配额不足,或者系统在sort写入输出文件时崩溃,或者发生其他一些错误,则可能会丢弃(即破坏)您的部分或全部数据。
简而言之,要对文件进行就地排序,可以使用以下方法:
sort -o filename filename
Run Code Online (Sandbox Code Playgroud)
Wil*_*sem 13
您可以使用该sponge功能,首先浸泡stdin然后将其写入文件,例如:
sort < f | sponge f
Run Code Online (Sandbox Code Playgroud)
缺点sponge是它会将输出临时存储在内存中,这对于大文件可能会有问题。否则,您必须先将其写入文件,然后再覆盖原始文件。
然而,正如其他答案所指出的那样,就地修改通常不是一个好主意,因为在一个过程中(例如sponge一个),机器可能会崩溃,然后您可能会丢失原始文件和新文件。您最好先将其写入不同的文件,然后使用原子mv(移动)指令。
用输出文件覆盖输入文件是很危险的,因为如果在写入文件时程序或系统崩溃,你就会丢失两者。
一些程序(主要是 GNU 版本)有一个就地选项(例如-i在 perl 和 GNU sed 上;-o在 GNU sort 上)。它们的工作方式是将数据放在一个临时文件中,然后将其移动到位。对于没有此类选项的sponge程序,Colin Watson 的实用程序(包含在Joey Hess 的 moreutils 中)可以为任何程序安全地完成这项工作(例如:我可以cut就地更改文件吗?;我如何让 iconv 用转换后的文件替换输入文件输出?)。
只有在您无法使用相同权限重新创建原始文件的极少数情况下,我才建议就地覆盖文件。在这种情况下,您最好将原始输入保存在某处。然后您可以简单地处理输入的副本并将其发送到原始文件中。
cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43597 次 |
| 最近记录: |