AWK 原地修改

AWK 原地修改

[TOC]

sed 可以通过 sed -i 实现对输入文件的直接修改, 也就是原地修改, i 是 in place 的意思. AWK 是没有此选项的, 如何实现原地修改的效果呢? 本文总结了 2 种方法.

凭直觉的话, 可能会想到如下写法:

1
awk '{print $0}' t > t

然而这么做, 输出的文件 t 最终是空的.

需要采用如下方式:

1
awk '{print $0 > "t"}' t

最常见的需要原地修改的场景是特定字符串的替换, 例如 gsub(), sub() 函数. 例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
$ echo -e "AA\nCAAB\nDD" > t #构造输入文件
$ cat t #确认输入文件内容
AA
CAAB
DD

#将 t 中所有的 AA 替换为 aa
$ awk '{gsub(/AA/,"aa");print > "t"}' t
$ cat t
aa
CaaB
DD

当然也可以曲线救国, 用临时文件(没那么优雅):

1
2
awk '{print $0}' t > temp
mv temp t

gawk 的 inplace extension

gawk 吸取 sed -i 的优点, 增加了一个 inplace extension. 对此拓展的加载, 这里不做介绍, 一般是加载进去的. 用法如下:

1
$ gawk -i inplace '{ gsub(/AA/, "aa") }; { print }' t

也可以同时保存原文件的副本:

1
2
$ gawk -i inplace -v inplace::suffix=.bak '{ gsub(/AA/, "aa") }
> { print }' t

详细可以参考 gawk 的手册.

作者

cx

发布于

2022-06-24

更新于

2022-07-16

许可协议