使用awk在原地保存修改

15 浏览
0 Comments

使用awk在原地保存修改

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

我知道可以使用重定向来写入修改内容。但是在 awk 中是否有相应的选项呢?

0
0 Comments

原因:

在使用awk命令时,我们通常使用该命令来直接修改文件的内容。然而,当我们尝试将awk命令保存到变量中并在类似的技巧中使用时,会遇到问题。在这种情况下,使用-i inplace方法保存修改将会破坏硬链接。

解决方法:

为了解决这个问题,我们可以使用一个小技巧来避免破坏硬链接。首先,我们将awk命令保存到一个变量中,并使用echo命令将其输出到文件中。具体操作如下:

awk_command="awk '{awk code}'"

echo "$(eval $awk_command file)" > file

这样,我们可以将awk命令保存到变量awk_command中,并使用eval命令来执行该命令并将结果输出到文件中。通过这种方法,我们可以在不破坏硬链接的情况下,将修改保存到文件中。

使用这个小技巧,我们可以方便地保存awk命令到变量中,并将其应用于文件的修改。这在需要频繁修改文件内容的情况下非常有用,尤其是当我们不想破坏硬链接时。通过将awk命令保存到变量中,并使用eval命令来执行它,我们可以实现在原地保存修改的效果,并确保硬链接的完整性。

0
0 Comments

在GNU Awk 4.1.0(发布于2013年)及以后的版本中,引入了"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

但是有人注意到在某些版本中,这个选项可能已经被移除了。在4.1.3版本中,有人发现"-i includefile --include=includefile"这个选项。然而,实际上,"inplace"是一个包含在gawk中的库,可以作为一个includefile来使用。

需要注意的是,使用这个选项时,"seen"数组会存储所有包含在命令中的文件中的重复行。所以如果每个文件都有一个共同的头部,那么在第一个文件之后的所有文件中都会删除这个头部。如果想要对每个文件进行独立处理,可以使用类似下面的命令:

for f in *.txt; do gawk -i inplace '!seen[$0]++' "$f"; done

另外需要注意的是,自GNU Awk 5.x以来,INPLACE_SUFFIX现在是一个命名空间变量,称为inplace::suffix。该扩展程序将回退到旧变量,但在5.0.0和5.0.1版本(Ubuntu 20.04 LTS附带的版本)中不支持,只有在5.1.0版本及以后的版本中才支持。为了避免任何问题,可以同时传递这两个变量。

总结一下,"Save modifications in place with awk"这个问题的出现原因是为了模拟GNU的"sed -i"功能,解决方法是使用GNU Awk的"inplace"扩展程序,并注意相关的注意事项和版本兼容性。

0
0 Comments

文章标题:使用awk将修改保存在原文件中的原因和解决方法

解决awk无法直接将修改保存在原文件中的问题,有两种方法可供选择。具体原因和解决方法如下所述。

首先,如果使用的是GNU awk 4.1.0或更高版本,则可以使用awk的-i选项将修改保存在原文件中。然而,对于较旧的版本,没有这个选项。因此,我们需要使用其他方法来实现此功能。

一种解决方法是使用sed命令的-i选项的替代方法。具体操作如下:

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

这个命令的作用是将文件的内容打印出来并重定向到一个临时文件tmp中,然后再将tmp文件重命名为原文件file。

另一种解决方法是使用GNU awk 4.1.0及更高版本的新功能,该功能在2013年10月发布的4.1.0版本中添加。具体操作如下:

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

这个命令将文件的第一列打印出来,并将修改保存在原文件中。如果需要创建备份文件,可以使用-v INPLACE_SUFFIX=.bak选项来指定备份文件的扩展名:

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

这样会在保存修改的同时创建一个以.bak为后缀的备份文件。

需要注意的是,这个新功能的实现方式并不是很符合awk的特点。因为awk语言的强大之处在于其简洁性,而-i inplace这个选项的长度超过了8个字符。但无论如何,这个功能的添加还是让人很高兴的。

以上是使用awk将修改保存在原文件中的原因和解决方法。对于那些无法使用-i选项的用户来说,可以通过sed命令的替代方法或升级到GNU awk 4.1.0及更高版本来解决这个问题。

0