Solaris awk-$0根据上下文表现不同
注意:此问题仅适用于Solaris的默认awk。Solaris awk-$0根据上下文表现不同,awk,solaris,sunos,Awk,Solaris,Sunos,注意:此问题仅适用于Solaris的默认awk。 GNU awk/gawk和Solaris的XPG4 awk并没有举例说明这种行为。 此外,这更像是一个“为什么”的问题,而不是一个“我如何解决这个”的问题 使用以下示例输入: a 10 b 20 c 42 d 99 f 01 在我的awk脚本中,我提取最后一个字段$NF用作值,并将其他所有字段用作键。为此,我设置了$NF=”“,并使用$0中剩余的内容作为键。 但是,根据我是直接使用$0还是先将其分配给变量,我会得到不同的结果: awk '{
GNU awk/gawk和Solaris的XPG4 awk并没有举例说明这种行为。
此外,这更像是一个“为什么”的问题,而不是一个“我如何解决这个”的问题
使用以下示例输入:
a 10
b 20
c 42
d 99
f 01
在我的awk脚本中,我提取最后一个字段$NF
用作值,并将其他所有字段用作键。为此,我设置了$NF=”“
,并使用$0
中剩余的内容作为键。但是,根据我是直接使用
$0
还是先将其分配给变量,我会得到不同的结果:
awk '{
# Extracting and removing the value
value = $NF;
$NF = "";
# Copying $0 to a variable
key = $0;
# Displaying the difference between "key" and "$0"
printf("key = <%s>\n", key);
printf("$0 = <%s>\n", $0 );
printf("\n");
}' < input.txt
awk'{
#提取和删除值
值=$NF;
$NF=“”;
#正在将$0复制到变量
密钥=$0;
#显示“键”和“$0”之间的差异
printf(“key=\n”,key);
printf($0=\n,$0);
printf(“\n”);
}“
这将产生以下输出:
key = <a 10>
$0 = <a >
key = <b 20>
$0 = <b >
key = <c 42>
$0 = <c >
key = <d 99>
$0 = <d >
key = <f 01>
$0 = <f >
键=
$0 =
键=
$0 =
键=
$0 =
键=
$0 =
键=
$0 =
请注意,$0
丢失了$NF
,但是键
仍然以某种方式包含它,即使它应该是$0
的直接副本
为什么会发生这种情况?正式的awk语言定义中是否有定义此行为的内容?当您更改最后一个字段时,该版本似乎不会重新生成
$0
<代码>$1=$1可能会触发它;见@BenjaminW我想你知道了什么。如果我将顺序更改为print$0
,key=$0
,print key
,则输出相同。我不知道为什么print$0
会强制更新,但key=$0
不会,但至少我们已经取得了进展。要知道Sunawk
是Aho,Wein,Kern.创建的原始awk版本。。任何Sun用户都知道使用nawk
获得“AWK编程语言”(Wiley pub)中记录的功能。那本书中偶尔会有关于原始awk与“新”awk(1988~);-)的讨论。但是你试图数一数在大头针头上跳舞的天使的数量继续,时光飞逝;-)好luck@shellter-伯杰-ighan@tripleee ; 是的,谢谢。我不确定我的答案是否会超出限制,所以我作弊以节省一些空间,而且我永远也不确定(如果不把书翻出来),是温伯格还是温伯格,还是维恩。