【问题标题】:re-initializing awk array created by split重新初始化由 split 创建的 awk 数组
【发布时间】:2014-10-17 17:51:18
【问题描述】:

我正在尝试使用 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,但没有任何效果。我需要做什么?

【问题讨论】:

    标签: arrays awk split


    【解决方案1】:

    不死的不是arr,而是s,因为你永远不会在循环之外[重新]将它初始化为""arr 在每次调用 split() 时都会重新启动。

    试试这个:

    {
        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) }
    

    作为练习的原因:-)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多