#!/bin/bash
awk '$1 == "abc" {print}' file # print lines first column matching "abc"
当第一列匹配数组成员(“12”或“34”或“56”)时如何打印行?
#!/bin/bash
ARR=("12" "34" "56")
添加
另外,当第一列完全匹配数组成员(“12”或“34”或“56”)时如何打印行?
答案 0 :(得分:4)
您可以使用bash
将字符串插入到Awk
中使用的正则表达式模式,方法是将IFS
值更改为|
字符并执行数组扩展,如下所示:
ARR=("12" "34" "56")
regex=$( IFS='|'; echo "${ARR[*]}" )
awk -v str="$regex" '$1 ~ str' file
数组扩展将列表元素转换为以|
分隔的字符串,例如在这种情况下12|34|56
。
子shell中运行的$()
确实在父shell中没有反映IFS
的值。你可以把它作为
awk -v str="$( IFS='|'; echo "${ARR[*]}" )" '$1 ~ str' file
OP还要求文件中数组的字符串与完全匹配,在这种情况下,使用grep
及其ERE支持可以完成工作
regex=$( IFS='|'; echo "${ARR[*]}" )
egrep -w "$regex" file
(或)
grep -Ew "$regex" file
答案 1 :(得分:1)
awk 单线
awk -v var="${ARR[*]}" 'BEGIN{split(var,array," "); for(i in array) a[array[i]] } ($1 in a){print $0}' file
答案 2 :(得分:0)
以下代码可以解决问题:
awk 'BEGIN{myarray [0]="aaa";myarray [1]="bbb"; test=0 }{
test=0;
for ( x in myarray ) {
if($1 == myarray[x]){
test=1;
break;
}
}
if(test==0) print}'
如果你需要将一个变量传递给awk,请使用-v选项,但是对于数组,它有点过时但是以下语法应该有用。
A=( $( ls -1p ) ) #example of list to be passed to awk (to be adapted to your needs)
awk -v var="$A" 'BEGIN{split(var,list,"\n")}END{ for (i in list) print i}'
答案 3 :(得分:0)
与Inian相同
ARR=("34" "56" "12");regex=" ${ARR[*]} ";regex="'^${regex// /\\|^}'";grep -w $regex infile