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

标签 bash awk

我想提取 CSV 文件中第 4 列包含特定数字的行。

CSV 文件的行如下所示:

Markus;Haltmeyer;ID;SomeIdentifier

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

在 bash 脚本中,变量 firstPartOfID 中只有 SomeIdentifier 的第一个字符。但无论如何,使用以下命令可以找到正确的行:

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

不幸的是结果包含两列。之后我可以尝试拆分 $result,但我想直接使用 awk 来完成。

最佳答案

您可以将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 }'

关于bash - 将 awk 结果存储在 bash 脚本的变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51949173/

相关文章:

linux - 我在哪里保存gunicorn_start.bash文件

linux - 使用 shell 脚本杀死 vim 进程会留下 .swp 文件

bash - 从 STDIN 读取并输出到文件

python - 我如何在 awk/start/,/stop/这样的 ruby​​ 中做一个范围正则表达式

bash - Shellscript : Comparing parameters, 输出最大值和最小值

arrays - 使用掩码获取唯一数组值

linux - 匹配模式并删除模式之前的 3 行以及匹配的模式行

unix - 根据字段分隔符将一行拆分为字符串

bash - 使用 grep/awk/UNIX 以列格式解析股票和价格的修复日志

date - 将 csv 文件的 yyyymmdd 转换为 mm/dd/yyyy