2013-05-13 50 views
79

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

我明白我可以使用重定向来编写更改。但是有没有在awk这样做的选项?

+0

另请参阅http://serverfault.com/a/547331/313521,以获得“通过重定向编辑文件”的更一般答案。 – Wildcard 2015-11-04 03:29:34

回答

68

在最新的GNU awk中(因为4.1.0 released),它具有"inplace" file editing的选项:

[...]的 “就地” 扩展名,使用新设施建成,可以用来模拟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 
+1

@sudo_O - 感谢“就地”演示。 Upvoted你的答案! – lind 2013-05-14 19:03:57

+0

看起来选项可能已被删除?对于4.1.3,我有“-i includefile \t \t --include = includefile” – 2016-06-18 11:46:31

+0

@Keith我有同样的问题。我只是试了一下,它在我的4.1.3上运行。根据[iiSeymour的回答](http://stackoverflow.com/a/16529730/2877364),'inplace'实际上是一个包含'gawk'的库,所以'inplace'是可以作为includefile包含的东西。 – cxw 2016-06-23 20:16:32

84

除非你有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月5日)加入此功能。它没有直前锋刚刚给-i选项,在发布的说明中介绍:

(从xgawk)新-i选项用于装载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 c汉字长I.M.O

这是一个链接到manual的官方词汇。

11

@sudo_O有权利answer

这不能工作:

someprocess <file> file 

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

2

如果你想要一个只有AWK-解决方案,而创建一个临时文件和能与版本!=(gawk 4.1.0):

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

但是,这是否缓冲整个文件到内存?考虑一个20GB的文件。 – 2016-11-29 23:52:30

5

只是一个小工程

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

将无法​​使用:换行符。 – Lloeki 2016-01-14 13:48:05

+1

@Lloeki谢谢,我已经修复了答案:) – 2016-09-05 06:56:55

3

下将无法正常工作

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

这应该工作

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

另一种方法是使用sponge

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

当您更换'{print $0}' r awk脚本和your_file按您想要编辑的文件的名称。

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

0

使用三通

awk '{awk code}' file | tee file 

tee命令发生和awk命令完成由于|之后执行。