繁体   English   中英

重新初始化由split创建的awk数组

[英]re-initializing awk array created by split

我正在尝试使用split来反转字符串中字符的顺序,该字符串在具有许多这样的行的文件中显示为第二个字段。 命令:

{
    n=split($2,arr," ");
    for(i=1;i<=n;i++)
         s=arr[i] s
}
{ print s }

只需一行。 但是,arr数组(和n)似乎是不朽的,因此当我将此代码嵌入到awk脚本中以处理多行时,与我要反转的字段相对应的输出会累积(并反转)所有先前的行:

1_B.pdb
GGTGYPGLKDKDDNEGTKYNKLLNATLIVTDVGNTIRTECPDVNRG
AARS_0001_B.pdb
GGTGYPGLKDKDDNEGTKYNKLLNATLIVTDVGNTIRTECPDVNRGGGTGYPGLKDKDDNEGTKYNKLLNATLIVTDVGNTIRTECPDVNRG
AARS_0002_B.pdb
GLILYDGFLDKRDLEGLKYNDILNRTKDVTDVGNTTRTECPDVNRKGGTGYPGLKDKDDNEGTKYNKLLNATLIVTDVGNTIRTECPDVNRGGGTGYPGLKDKDDNEGTKYNKLLNATLIVTDVGNTIRTECPDVNRG
AARS_0003_B.pdb
DGCSLDGFTDDRDLKGALYNKILNKTLIVTDVGNTTRTEVCEKDRYGLILYDGFLDKRDLEGLKYNDILNRTKDVTDVGNTTRTECPDVNRKGGTGYPGLKDKDDNEGTKYNKLLNATLIVTDVGNTIRTECPDVNRGGGTGYPGLKDKDDNEGTKYNKLLNATLIVTDVGNTIRTECPDVNRG

在我看来,这是重新初始化的问题。 我试图删除arr []的所有先前元素,并将n重置为0,而没有任何效果。 我需要做什么?

这不是arr这是不朽的,这是s ,因为你永远不[重新]初始化它""循环外。 每次调用split()都会重新初始化arr

尝试这个:

{
    n=split($2,arr,/ /)
    s=""
    for(i=1;i<=n;i++)
         s=arr[i] s
    print s
}

顺便说一句,split()的第三个参数是字段分隔符,而不是字符串,并且字段分隔符是具有几个额外属性的正则表达式,因此使用固定的“字符串”调用split的正确方法是使用RE分隔符split($2,arr,/ /) ,不是字符串分隔符split($2,arr," ") 在这种情况下,它不会产生功能上的差异,但是当字段分隔符变得更加复杂时,它会起作用,因此最好习惯于以正确的方式进行操作。

奖金圆:你不会需要明确重新初始化s ,如果你把这些代码在一个函数:

function rev(str,     arr,n,s,i) {
    n=split(str,arr,/ /)
    for(i=1;i<=n;i++)
         s=arr[i] s
    return s
}
...
{ print rev($2) }

留下原因作为练习:-)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM