awk 不分配字符串或子字符串

awk not assigning strings or substrings

我已经编写了一个 awk 脚本来将日志文件的输出解析为 excel 的 tsv,并且一切正常。然后我想通过从字段中提取子字符串向 tsv 添加一列。但我终其一生都无法使用 awk 提取该子字符串,甚至无法将字段分配给变量。我花了几个小时试图弄清楚发生了什么但无济于事。这是让我疯狂的脚本部分:

                    printf("[=10=]=%s\n", [=10=]);
                    printf("=%s\n", );
                    printf("=%s\n", );
                    inputLine = [=10=];
                    cmd = ;
                    wavFile = ;
                    printf("inputLine=%s\n", $inputLine );
                    printf("cmd=%s\n", $cmd );
                    printf("wavFile=%s\n", $wavFile );
                    uScore = index($wavFile, "_" );
                    printf("uscore=%d\n", uScore );
                    ucNum = substr($wavFile, 9, 13 );
                    testPhrase = substr(, index(,"_")+1, length() );
                    printf("ucNUm = %s\n", $ucNum );
                    printf("testPhrase= %s\n", $testPhrase );

这是生成的输出:

[=11=]=Loading uc60_why_is_that_blinking.wav
=Loading
=uc60_why_is_that_blinking.wav
inputLine=Loading uc60_why_is_that_blinking.wav
cmd=Loading uc60_why_is_that_blinking.wav
wavFile=Loading uc60_why_is_that_blinking.wav
uscore=13
ucNUm = Loading uc60_why_is_that_blinking.wav

我做错了什么?

谢谢......

感谢埃德提供这些提示。我现在可以正确分配变量。但是我仍然没有分配子字符串。这是更新后的脚本:

                    printf("[=12=]=%s\n", [=12=]);
                    printf("=%s\n", );
                    printf("=%s\n", );
                    inputLine = 0;
                    cmd = 1;
                    wavFile = 2;
                    printf("inputLine=%s\n", $inputLine );
                    printf("cmd=%s\n", $cmd );
                    printf("wavFile=%s\n", $wavFile );
                    uScore = index($wavFile, "_" );
                    printf("uscore=%d\n", uScore );
                    ucNum = substr(wavFile, 1, $uScore );
                    testPhrase = substr(wavFile, $uScore+1, length($wavFile) );
                    printf("ucNum = %s\n", $ucNum );
                    printf("testPhrase= %s\n", $testPhrase );

和修改后的输出:

[=13=]=Loading uc60_why_is_that_blinking.wav
=Loading
=uc60_why_is_that_blinking.wav
inputLine=Loading uc60_why_is_that_blinking.wav
cmd=Loading
wavFile=uc60_why_is_that_blinking.wav
uscore=5
ucNum = Loading uc60_why_is_that_blinking.wav
testPhrase= uc60_why_is_that_blinking.wav

我尝试用 substr(wavFile, 1, uScore) 和 substr($wavFile, 1, $uScore) 提取 ucNum 字符串,但都没有提取子字符串。还有其他想法吗?

您在 awk 变量前面使用了 $,因此不希望得到由变量的整数值引用的字段,而不是简单的变量值(或 [=16=],如果变量未设置或它的内容是非数字的)。

$ echo "foo bar" | awk '{x=1;       print "[" x "]\t[" int(x) "]\t[" $x "]"}'
[1]     [1]     [foo]

$ echo "foo bar" | awk '{           print "[" y "]\t[" int(y) "]\t[" $y "]"}'
[]      [0]     [foo bar]

$ echo "foo bar" | awk '{z="stuff"; print "[" z "]\t[" int(z) "]\t[" $z "]"}'
[stuff] [0]     [foo bar]

查看您的代码并注意执行您想要的打印语句之间的区别:

printf("uscore=%d\n", uScore );

以及任何不符合的,例如:

printf("ucNUm = %s\n", $ucNum );

顺便说一下,后面的分号什么也没做,括号也没有按照您的想法进行,也可以删除:

printf "ucNum = %s\n", ucNum

甚至只是:

print "ucNum =", ucNum