使用awk进行就地编辑时如何刷新输出?

使用awk进行就地编辑时如何刷新输出?,awk,in-place,fflush,Awk,In Place,Fflush,我想使用awk在原地编辑一个大文件的列。如果由于任何原因,流程中断/停止,我不想失去已经完成的工作。我试着添加了fflush,但它似乎不适合 为了模拟期望的结果,这里有一个包含3列的测试文件。最后一列为全零 paste -d '\t' <(seq 1 10) <(seq 11 20) | awk 'BEGIN {FS="\t"; OFS=FS} {$(NF+1)=0; print}' > testfile 如果在脚本结束前按ctrl+z组合键运行脚本并将其中止,则测

我想使用awk在原地编辑一个大文件的列。如果由于任何原因,流程中断/停止,我不想失去已经完成的工作。我试着添加了fflush,但它似乎不适合

为了模拟期望的结果,这里有一个包含3列的测试文件。最后一列为全零

paste -d '\t' <(seq 1 10) <(seq 11 20) | 
    awk 'BEGIN {FS="\t"; OFS=FS} {$(NF+1)=0; print}' > testfile
如果在脚本结束前按ctrl+z组合键运行脚本并将其中止,则测试文件将保持不变


当脚本中断或停止时,是否有可能获得期望的结果或部分结果?我该怎么做呢?

就地编辑并不是真的。一个临时文件保存输出,并替换脚本末尾的输入

实际的就地编辑会很慢:除非输出与输入长度相同,否则文件大小需要更改,awk必须在当前行之后重新写入整个文件,至少在每次缓冲区刷新时是这样。请注意以下注意事项:

如果程序过早终止…可能会留下一个临时文件

您可以编写一些恢复代码,以便在中止后将临时文件与输入合并

或者,您可以将脚本调整为每次运行只修改一行,只需打印后续的每一行,不进行修改,然后重新运行,直到没有要做的更改为止。这将迫使awk在每次更改时重新写入文件。它会很慢,但是没有任何快速的方法可以从文件中间删除数据。

在不使用-i inplace的情况下尝试,并通过重定向到新文件保存输出,即awk“code”file>newFile。您始终可以重命名原始文件,但这样会失去进程的可跟踪性。
awk -i inplace 'BEGIN {FS="\t"; OFS=FS} $3==0{$3=$1+$2; print; fflush(); system("sleep 1")}' testfile