那些令人惊叹的awk简略写法

2023-12-20 20:43:06

???????awk是一门美妙的语言,被称为unix命令行工具皇冠上的明珠。它有很多简略写法,用好了可以用极少的代码快速解决问题。

下面就列举一些令人惊叹的awk简略写法:

awk '{sub(/pattern/, "foobar")} 1' # 无论替换是否成功,始终为真的条件“1”都会打印每一行
awk 'NR % 6' # 打印除第 6、12、18 行以外的所有行...
awk 'NR > 5' # 从第 6 行开始打印(如 tail -n 6 或 sed '1,5d')
awk '$2 == “foo”' # 打印第二个字段为 “foo” 的行
awk 'NF >= 6' # 打印包含 6 个或更多字段的行
awk '/foo/ & & /bar/' # 打印与 /foo/ 和 /bar/ 匹配的行,顺序不限
awk '/foo/ && !/bar/' # 打印与 /foo/ 匹配但不匹配 /bar/ 的行
awk '/foo/ ||/bar/' # 打印匹配 /foo/ 或 /bar/ 的行(如 grep -e 'foo' -e 'bar')
awk '/foo/,/bar/' # 从行匹配 /foo/ 打印到行匹配 /bar/,包括
awk 'NF' # 只打印非空行(或者:不打印空行,其中 NF==0)
awk 'NF--' # 删除最后一个字段并打印该行
awk '$0 = NR“ ”$0' # 前置行号(赋值在条件中有效)
awk '!a[$0] ' # 抑制重复的行!(弄清楚它是如何工作的)

另一个例子?

$ seq 1 30 | awk 'ORS=NR%5?FS:RS'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30

上面这行代码所做的是将输入列化(这里以五列为一组,但只需将代码中的数字5更改为您想要的数字,或者使用一个变量并使用-v传递值)。为什么它会起作用?当awk打印一条输出记录(行)时,特殊变量ORS,顾名思义,包含附加到该行的分隔符。默认情况下,ORS为“\n”,即换行符。但是这里我们是根据三元运算符的结果显式地给ORS赋值。因此,如果NR%5为零(即,我们在第5,10,15行,等等),ORS获取RS的值(默认包含“\n”);否则,ORS将获取FS的值(默认情况下是一个空格)。

看到这里,你是否已对awk这门精巧的语言产生兴趣了呢?

?欢迎关注微信公众号:文本魔术,了解更多?

文章来源:https://blog.csdn.net/wannianchuan/article/details/135115385
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。