【发布时间】:2019-09-12 16:30:33
【问题描述】:
我想使用 awk 编辑大文件 inplace 的一列。如果由于任何原因进程中断/停止,我不想丢失已经完成的工作。我尝试添加fflush,但似乎与inplace 不符。
为了模拟想要的结果,这里有一个包含 3 列的测试文件。最后一列全为零。
paste -d '\t' <(seq 1 10) <(seq 11 20) |
awk 'BEGIN {FS="\t"; OFS=FS} {$(NF+1)=0; print}' > testfile
然后我想替换最后一列中的值。在这个简单的示例中,我只是将它们替换为第一列和第二列的总和。我正在添加系统睡眠,因此可能会在中间中止脚本以查看结果。
awk -i inplace 'BEGIN {FS="\t"; OFS=FS} $3==0{$3=$1+$2; print; fflush(); system("sleep 1")}' testfile
如果你运行脚本并在它结束之前中止它(ctrl+z),测试文件不会改变。
是否有可能达到预期的结果(当脚本中断或停止时得到部分结果)?我该怎么做?
【问题讨论】:
-
尝试不使用
-i inplace并通过重定向到新文件(即awk 'code' file > newFile)来保存输出。 (您始终可以重命名您的 orig 文件,但这样您就失去了流程的可追溯性)。