这个 awk 命令是如何工作的?

这个 awk 命令是如何工作的?

考虑该文件test.txt

pfg025G
pfg025T
pfg034T
pfg039G

现在考虑以下 awk 命令及其输出:

awk '(NR>1) {print "s/"p"/"$1"/g"}{p=$1}' test.txt

s/pfg025G/pfg025T/g
s/pfg025T/pfg034T/g
s/pfg034T/pfg039G/g

NR>1对于大于 1 的行为真,这对于该"$1"术语有效,但对于"p"取第一行值的术语无效。这是为什么?是否NR>1仅评估第一个块{}而不评估第二个块{p=$1}?为什么第一个"$1"有双引号""而第二个$1没有?

答案1

你(分割的)awk 命令看起来像

awk '(NR>1) {print "s/"p"/"$1"/g"}
            {p=$1}'

意思是

  • {print "s/"p"/"$1"/g"}什么时候做NR>1
  • {p=$1}总是做
  • "s/"p"/"$1"/g"引号分割 (1): "s/" + p + "/" + $1 + "/g",既不被引用p,也不$1被引用
  • (1)+对于串联,请注意 awk 使用空格(无空格)作为隐式串联运算符

在第一行,only{p=$1}被执行。

{print "s/"p"/"$1"/g"}首先执行第二行,并且 的值p从第一行开始初始化。

最后一行,p最终pfg039G被丢弃。


在同一代码块中使用分号来创建一系列命令:

awk '(NR>1) {print "s/"p"/"$1"/g" ; p=$1}' test.txt
s//pfg025T/g
s/pfg025T/pfg034T/g
s/pfg034T/pfg039G/g

现在,结果正如使用$1上一场比赛所预期的那样 - 第一行$1是空的。

相关内容