在循环内将bash数组元素传递给awk regex

在循环内将bash数组元素传递给awk regex,regex,bash,awk,Regex,Bash,Awk,我正在尝试使用awk搜索一个文件,方法是在bash数组的元素上循环。这就是我目前正在做的 myarray[1] = 441 myarray[2] = 123 for i in "${myarray[@]}" do awk '{if ($4 == '"$i"') print $0}' myfile.txt > newfile.txt done 可以用这种方式访问awk中bash数组的元素吗?这不是将shell变量(或bash数组元素)传递给awk的正确方式。与-v选项一起使用: myar

我正在尝试使用awk搜索一个文件,方法是在bash数组的元素上循环。这就是我目前正在做的

myarray[1] = 441
myarray[2] = 123

for i in "${myarray[@]}"
do
awk '{if ($4 == '"$i"') print $0}' myfile.txt > newfile.txt
done

可以用这种方式访问awk中bash数组的元素吗?

这不是将shell变量(或bash数组元素)传递给awk的正确方式。与
-v
选项一起使用:

myarray=(441 123)

for i in "${myarray[@]}'"; do
   awk -v i="$i" '$4 == i' myfile.txt > newfile.txt
done
  • -v i=“$i”
    使shell变量
    $i
    awk
    中作为awk变量
    i
  • $4==i
    相当于
    {if($4==i)print$0}
    ,因为
    print$0
    是默认操作

    • 不需要bash循环;您可以在awk中完成全部工作:

      my_array=(441 123)
      awk -varr="${my_array[*]}" 'BEGIN{split(arr,a); for(i in a)b[a[i]]} $4 in b' file
      
      shell数组的内容作为单个字符串传递给awk,每个元素之间有一个空格<代码>拆分用于从字符串创建awk数组。数组
      a
      如下所示:

      a[1]=441; a[2]=123
      
      for
      循环创建一个带有两个键的数组
      b
      b[441]
      b[123]

      当第4列与其中一个数组键匹配时,将打印行


      请记住,当数组中的元素包含空格时,这种方法会失败。

      您还可以构造一个awk正则表达式:

      myarray=(441 123)
      regex=$(IFS=\|;echo "^(${myarray[*]})\$")
      awk -v regex="$regex" '$4 ~ regex' myfile.txt > newfile.txt
      

      但是,如果数组的任何元素中都有元字符(即“*”、“\”、“?”等),请务必小心。

      可以避免在外部循环通过
      bash
      数组元素。在下文中,数组元素一次性传递到
      awk
      ,并使用
      ARGV
      awk
      中访问。另外,
      awk
      没有理由不能直接写入输出文件

      awk -v len="${#myarray[@]}" '
      BEGIN{t=ARGC; ARGC-=len; for(i=2; i<t; ++i) b[ARGV[i]]++ };
      $4 in b { print > "newfile.txt"}' myfile.txt  "${myarray[@]}"
      
      awk-v len=“${#myarray[@]}”
      开始{t=ARGC;ARGC-=len;for(i=2;i“newfile.txt”}'myfile.txt“${myarray[@]}”
      
      您没有访问那里的数组元素。您正在访问一个普通的shell变量。是的,如果您在awk上下文中引用字符串(即,您需要
      ““$i”””
      而不仅仅是
      “$i”
      )。这似乎不起作用,我将“$i”替换为“441”我知道它在文件中,这是有效的。所以我认为问题仍然在于定义循环中的元素。一旦引号被修复,请注意
      awk
      仍然不是“访问shell变量”。而是在传递给awk的字符串中使用shell变量的值。
      $i
      的值在执行
      awk
      命令之前由shell展开。
      “${myarray[@]}”展开中的右引号之前有一个额外的单引号
      这可能是让你困惑的原因。我已经编辑掉了额外的单引号,这并不是让我困惑的原因。只是一个小提示,使用
      >newfile.txt而不是
      >newfile.txt
      ,否则你将只看到最后一个awk命令的输出。这也不起作用。我可以用441替换“$4==I”中的I,并获得oUPUT,但它不承认IU也可以将<代码> > NexFr.TXT < /C> >从<代码> AWK > <代码>完成/<代码>,因此文件只写入一次而不是写入,然后每次附加。anubhava,我想我可能无法处理嵌入空间的问题