[英]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.