如何在bash中打印具有匹配数组的特定列的行

时间:2017-10-30 07:17:06

标签: linux bash awk

#!/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”)时如何打印行?

4 个答案:

答案 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