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

tcl*_*rke 7 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
Run Code Online (Sandbox Code Playgroud)

是否有可能以这种方式访问​​awk中bash数组的元素?

anu*_*ava 5

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

myarray=(441 123)

for i in "${myarray[@]}'"; do
   awk -v i="$i" '$4 == i' myfile.txt > newfile.txt
done
Run Code Online (Sandbox Code Playgroud)
  • -v i="$i"使shell变量作为awk变量$i在内部可用awki
  • $4 == i相当于,{if ($4 == i) print $0}因为print $0是默认操作

  • 您也可以将`> newfile.txt`从`awk`移动到`done`,这样文件只写一次而不是写,然后每次都附加. (3认同)

Tom*_*ech 5

不需要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
Run Code Online (Sandbox Code Playgroud)

shell数组的内容作为单个字符串传递给awk,每个元素之间有一个空格.split用于从字符串创建awk数组.数组a看起来像这样:

a[1]=441; a[2]=123
Run Code Online (Sandbox Code Playgroud)

所述for环路创建一个数组b与两个密钥,b[441]b[123].

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

请记住,当数组中的元素包含空格时,此方法将失败.