Solaris awk-$0根据上下文表现不同

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 '{

注意:此问题仅适用于Solaris的默认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
不会,但至少我们已经取得了进展。要知道Sun
awk
是Aho,Wein,Kern.创建的原始awk版本。。任何Sun用户都知道使用
nawk
获得“AWK编程语言”(Wiley pub)中记录的功能。那本书中偶尔会有关于原始awk与“新”awk(1988~);-)的讨论。但是你试图数一数在大头针头上跳舞的天使的数量继续,时光飞逝;-)好luck@shellter-伯杰-ighan@tripleee ; 是的,谢谢。我不确定我的答案是否会超出限制,所以我作弊以节省一些空间,而且我永远也不确定(如果不把书翻出来),是温伯格还是温伯格,还是维恩。