【问题标题】:Parallelise extraction of bash array elements with awk使用 awk 并行提取 bash 数组元素
【发布时间】:2014-10-15 16:30:22
【问题描述】:

我的虚拟 bash 数组是:

   myArray=(Ann Becky Diana)

我的虚拟文件如下所示:

   Ann       9  
   Becky     7
   Caroline  8
   Diana     5

我想从我的虚拟文件中提取/grep 以 myArray 中的项目开头的所有行,结果如下:

   Ann       9  
   Becky     7
   Diana     5

我可以使用 for 循环来做到这一点:

  for NAME in "${myArray[@]}"; do
      awk -v NAME="$NAME" '/^NAME/' dummy.file >> output
  done

我的问题
如何在不使用循环的情况下将 bash 数组发送到 awk 并提取想要的信息?是否可以对整个数组进行操作?

我希望可以做类似这样的事情:

   awk -v ARRAY="${myArray[*]}" '/^ARRAY/' dummy.file

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    您可以像这样使用grep -Ffprintf

    array=(Ann Becky Diana)
    
    grep -Ff <(printf "%s\n" "${array[@]}") f
    Ann       9
    Becky     7
    Diana     5
    

    PS:由于在其中使用了点,您不能将my.array=(Ann Becky Diana) 作为my.array 包含在无效的shell 变量名中。

    【讨论】:

    • 好的,这确实是您期望从 grep 得到的输出?
    • 是的,这行得通。虽然我仍然会和wgrepgrep -wFf
    • 是的-w 将是这个grep 中的方便选项
    【解决方案2】:

    你可以这样使用:

    myarray=(Ann Becky Diana)
    awk -v ARR="{myarray[*]}" 'BEGIN{split(ARR,list," ")} {
       for (i=1;i<=length(list);i++)
           if($1 == list[i])
              print $0
    }' dummy.txt
    

    我们将myarray 传递给ARR 变量中的awk。在BEGIN中,我们拆分并保存到list数组中,以便在awk中使用。

    【讨论】:

      猜你喜欢
      • 2018-03-26
      • 2017-02-23
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 2014-03-19
      • 2011-09-10
      • 1970-01-01
      • 2012-07-14
      相关资源
      最近更新 更多