我正在学习awk,我想知道是否有一个选项来写入更改文件,类似于sed,我会使用-i选项来保存修改文件。我知道我可以使用重定向来写更改。但是在awk中是否有这样的选项呢?
awk
sed
-i
wyyhbhjk1#
在GNU Awk 4.1.0(2013年发布)和更高版本中,它有"inplace" file editing的选项:[...]使用新工具构建的“inplace”扩展可用于模拟GNU“sed -i“特性。[...]示例用法:
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
wooyq4lh2#
除非你有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选项:新的-i选项(来自xgawk)用于加载awk库文件。这与-f的不同之处在于,第一个非选项参数被视为脚本。您需要使用捆绑的inplace.awk包含文件来正确调用扩展,如下所示:
GNU awk
inplace.awk
$ cat file 123 abc 456 def 789 hij $ gawk -i inplace '{print $1}' file $ cat file 123 456 789
变量INPLACE_SUFFIX可用于指定备份文件的扩展名:
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个字符太长 i.m.o。这里有一个链接到手册为官方的话。
-i inplace
z4iuyo4d3#
只是一个小黑客,
echo "$(awk '{awk code}' file)" > file
frebpwbc4#
另一种方法是使用sponge:
sponge
awk '{print $0}' your_file | sponge your_file
在这里,您将'{print $0}'替换为awk脚本,将your_file替换为您要编辑的文件的名称。sponge在将其保存到文件之前完全吸收输入。
'{print $0}'
your_file
7uhlpewt5#
@sudo_O有正确的answer。这行不通:
someprocess < file > file
shell在将控制权移交给someprocess(重定向)之前执行重定向。>重定向将文件截断为零大小(重定向输出)。因此,当某个进程启动并希望从文件中读取时,没有数据可供它读取。
>
bqf10yzr6#
跟不上
echo $(awk '{awk code}' file) > file
这应该工作
brc7rcf07#
如果你想要一个awk的解决方案,而不创建一个临时文件,并与版本可用!=(gawk 4.1.0):
awk '{a[b++]=$0} END {for(c=0;c<=b;c++)print a[c]>ARGV[1]}' file
wlp8pajw8#
重复删除示例:
echo "$(awk '!x[$0]++' <(cat file))" > file
不需要使用临时文件。
8条答案
按热度按时间wyyhbhjk1#
在GNU Awk 4.1.0(2013年发布)和更高版本中,它有"inplace" file editing的选项:
[...]使用新工具构建的“inplace”扩展可用于模拟GNU“
sed -i
“特性。[...]示例用法:
要保留备份,请执行以下操作:
wooyq4lh2#
除非你有GNU awk 4.1.0或更高版本...
你不会有像sed的
-i
选项这样的选项,所以你可以这样做:注意:
-i
并不是魔术,它也是创建一个临时文件sed
只是为你处理它。从GNU awk 4.1.0开始
GNU awk
在版本4.1.0 (发布于2013年10月5日) 中添加了此功能。它并不像发布的注解中描述的那样直接给出-i
选项:新的-i选项(来自xgawk)用于加载awk库文件。这与-f的不同之处在于,第一个非选项参数被视为脚本。
您需要使用捆绑的
inplace.awk
包含文件来正确调用扩展,如下所示:变量
INPLACE_SUFFIX
可用于指定备份文件的扩展名:我很高兴添加了这个功能,但对我来说,实现并不是很尴尬,因为强大的力量来自语言的简洁性,
-i inplace
是8个字符太长 i.m.o。这里有一个链接到手册为官方的话。
z4iuyo4d3#
只是一个小黑客,
frebpwbc4#
另一种方法是使用
sponge
:在这里,您将
'{print $0}'
替换为awk脚本,将your_file
替换为您要编辑的文件的名称。sponge
在将其保存到文件之前完全吸收输入。7uhlpewt5#
@sudo_O有正确的answer。
这行不通:
shell在将控制权移交给someprocess(重定向)之前执行重定向。
>
重定向将文件截断为零大小(重定向输出)。因此,当某个进程启动并希望从文件中读取时,没有数据可供它读取。bqf10yzr6#
跟不上
这应该工作
brc7rcf07#
如果你想要一个awk的解决方案,而不创建一个临时文件,并与版本可用!=(gawk 4.1.0):
wlp8pajw8#
重复删除示例:
不需要使用临时文件。