将awk结果存储在bash脚本中的变量中

时间:2018-08-21 12:54:39

标签: bash awk

我想提取CSV文件的行,其中第4列包含某个数字。

CSV文件的行如下所示:

Markus;Haltmeyer;ID;SomeIdentifier

如果不熟悉SomeIdentifier,我想将第一列和第二列分别存储在不同的变量中。

在bash脚本中,变量SomeIdentifier中只有firstPartOfID的前几个字符。但是,尽管如此,使用以下命令仍然可以找到正确的行:

result=$(awk -v pat="${firstPartOfID}" -F ";" '$0~pat{print $1, $2 }' MyFile.csv)
echo ${result}

很遗憾,result包含这两列。我可以尝试在之后拆分$ result,但我想直接用awk做到。

2 个答案:

答案 0 :(得分:3)

您可以将read与进程替换一起使用:

read var1 var2 < <(awk -v regexp="${firstPartOfID}" -F ";" '$0~regexp{print $1, $2 }')

我假定输出不包含空格(定界符除外)。否则,您需要在awk中使用其他输出定界符,并在read中使用该定界符:

IFS=";" read var1 var2 < <(awk -v regexp="${firstPartOfID}" 'BEGIN{FS=OFS=";"}$0~regexp{print $1, $2 }')

在上面的示例中,我使用;作为输出分隔符。使用它很有意义,因为它也是输入定界符,因此可以保证它不包含在数据中。


顺便说一句,可以使用awk中的index()函数来代替正则表达式。这样会更有效率。

awk -v id_prefix="${firstPartOfID}" -F ";" 'index($3, id_prefix){print $1, $2 }'

答案 1 :(得分:2)

如果您想要多个值,也可以跳过awk,而只需使用bash进行模式匹配:

while IFS=\; read first last idfield rest; do
    if [[ $idfield =~ $firstPartOfID ]]; then
        first_name=$first
        last_name=$last
        break
    fi
done < MyFile.csv

或者根据您想要在之后使用这些值做什么,您也许可以在awk

内完成