AWK在提取变量时抱怨字段数

我有一个脚本来解析TeamCity目录映射文件。该脚本可以工作,但是我想知道为什么将其重构为使用变量会导致它看起来不相关的错误消息,以及如何使用变量仍然可以使它工作。

MAP=/opt/TeamCity/buildAgent/work/directory.map                                                                                                                                  
sed -n -e '1,3d;1,/#/{/#/!p}' $MAP | \                                                                                                                                           
awk '   {                                                                                                                                                                        
            n=split($0,array,"->");                                                                                                                                            
            printf(substr(array[1],6) substr(array[2],2,16) "\n");                                                                                                              
        }                                                                                                                                                                        
'                                                                                                                                                                                

此打印

nicecorp::Master 652293808ace4eb5
nicecorp::Reset Database 652293808ace4eb5
nicecorp::test-single-steps 652293808ace4eb5
nicecorp::Develop 652293808ace4eb5
nicecorp::Pull Requests 652293808ace4eb5

几乎是我想要的。

重构失败

但是后来我试图将子字符串提取到变量中,脚本就坏了。我将最后一个printf语句更改为此

proj=substr(array[1],6); 
tcdir=substr(array[2],16);
printf($proj"  " $tcdir);

这只是打印此错误,尽管我认为它大致相同?

awk: program limit exceeded: maximum number of fields size=32767
        FILENAME="-" FNR=1 NR=1

这个错误似乎有点奇怪,因为我的总输入量约为500个字节,比他们抱怨的字段限制少60倍。

AWK版本mawk(1994年)

数据格式$ head -10 directory.map

#Don't edit this file!
#Nov 5,2019 1:49:26 PM UTC
--version=2
bt30=nicecorp::Master -> 652293808ace4eb5 |?| Oct 29,2019 4:14:27 PM UTC |:| default
bt32=nicecorp::Reset Database -> 652293808ace4eb5 |?| Oct 30,2019 1:01:48 PM UTC |:| default
bt33=nicecorp::test-single-steps -> b96874cc9acaf874 |?| Nov 4,2019 4:20:13 PM UTC |:| default
bt33=nicecorp::test-single-steps -> 652293808ace4eb5 |?| Nov 5,2019 9:00:37 AM UTC |:| default
bt28=nicecorp::Develop -> 652293808ace4eb5 |?| Nov 5,2019 1:07:53 PM UTC |:| default
bt29=nicecorp::Pull Requests -> 652293808ace4eb5 |?| Nov 5,2019 1:18:08 PM UTC |:| default
#
likexiaoshuang 回答:AWK在提取变量时抱怨字段数

问题的根源在于重构中的print语句对变量使用了外壳符号($ proj代替proj,$ tcdir代替tcdir)。

当这些值是数字值(例如,第一行的tcdir = 652293808ace4eb5)时,awk(在这种情况下为awk)将尝试打印第652293808列。当前版本的gawk不会在这里失败-他们将意识到只有很少的列,并且将为那些字段显示空字符串(或$ 0的完整行,如果值是非数字的话)

较旧的版本可能会尝试扩展字段列表数组以匹配请求的数字,从而产生limit exceeded消息。

还要注意两个小问题-重构代码使用proj作为格式-如果包含'%',它将引起混淆。此外,缺少换行符。你真的是说printf而不是打印吗?

修复:

proj=substr(array[1],6); 
tcdir=substr(array[2],2,16);
# Should consider print,instead of printf
printf(proj "  " tcdir "\n");
# print proj,tcdir
,

问题在于语法。我使用的是外壳样式$tcdir来插入变量的值,而不是简单地插入tcdir。 “(对我来说是未知的)”表示tcdir的{​​{1}}部分已解析为某个数字字段值,这意味着我正在尝试打印字段的值,而不是变量$tcdir

本文链接:https://www.f2er.com/3158933.html

大家都在问