我想提取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做到。
答案 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