考虑该文件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
是空的。