在循环内将bash数组元素传递给awk regex
我正在尝试使用awk搜索一个文件,方法是在bash数组的元素上循环。这就是我目前正在做的在循环内将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
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
使shell变量-v i=“$i”
在$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,我想我可能无法处理嵌入空间的问题