使用awk保存修改

时间:2013-05-13 19:30:36

标签: linux unix awk

我正在学习awk,我想知道是否有选项可以将更改写入文件,类似于sed,我会使用-i选项将修改保存到文件。

我明白我可以使用重定向来编写更改。但awk是否有选项可以做到这一点?

8 个答案:

答案 0 :(得分:112)

除非你有GNU awk 4.1.0或更高版本......

你不会有sed的-i选项这样的选项,所以改为:

$ awk '{print $0}' file > tmp && mv tmp file

注意:-i并非神奇,它也会创建一个临时文件sed,只需为您处理。


从GNU awk 4.1.0开始......

GNU awk在版本4.1.0 (2013年10月10日发布)中添加了此功能。它不像提供-i选项那样直截了当,如发布的说明中所述:

  

新的-i选项(来自xgawk)用于加载awk库文件。这与-f的不同之处在于第一个非选项参数   被视为一个脚本。

您需要使用捆绑的inplace.awk包含文件来正确调用扩展名,如下所示:

$ cat file
123 abc
456 def
789 hij

$ gawk -i inplace '{print $1}' file

$ cat file
123
456
789

变量INPLACE_SUFFIX可用于指定备份文件的扩展名:

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{print $1}' file

$ cat file
123
456
789

$ cat file.bak
123 abc
456 def
789 hij

我很高兴这个功能已被添加,但对我而言,实现并不是非常糟糕,因为功能来自语言的简洁性,-i inplace是8个字符太长 imo

以下是官方字词manual的链接。

答案 1 :(得分:104)

在最新的GNU Awk中(自4.1.0 released起),它可以选择"inplace" file editing

  

[...]使用新工具构建的“inplace”扩展可用于模拟GNU“sed -i”功能。 [...]

使用示例:

$ gawk -i inplace '{ gsub(/foo/, "bar") }; { print }' file1 file2 file3

保留备份:

$ gawk -i inplace -v INPLACE_SUFFIX=.bak '{ gsub(/foo/, "bar") }
> { print }' file1 file2 file3

答案 2 :(得分:13)

@sudo_O有权answer

这不起作用:

someprocess < file > file

shell在将控制权移交给某个进程(redirections)之前执行重定向>重定向会将文件截断为零大小(redirecting output)。因此,当某个进程启动并想要从文件中读取时,没有数据可供读取。

答案 3 :(得分:11)

另一种方法是使用sponge

awk '{print $0}' your_file | sponge your_file

您使用awk脚本替换'{print $0}',并使用您要编辑的文件名称替换your_file

sponge在将输入保存到文件之前完全吸收输入。

答案 4 :(得分:10)

只是一个有效的小黑客

echo "$(awk '{awk code}' file)" > file

答案 5 :(得分:4)

继续工作之后

echo $(awk '{awk code}' file) > file

这应该有效

echo "$(awk '{awk code}' file)" > file

答案 6 :(得分:4)

使用tee

 awk '{awk code}' file | tee file

tee命令在awk命令完成后由|发生并执行。

答案 7 :(得分:3)

如果您想要一个仅支持awk的解决方案而不创建临时文件并且可以使用版本!=(gawk 4.1.0):

awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file