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
我已经编写了一个 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