我正在尝试使用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数组的元素?
这不是将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是默认操作不需要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列与其中一个数组键匹配时,将打印行.
请记住,当数组中的元素包含空格时,此方法将失败.