如何在扩展变量时将 bash 脚本中字符串变量中的 '$N' 用作 awk 命令中的运算符?

How to make a '$N' within a string variable in a bash script be used as a operator in awk command when variable is expanded?

因此,由于这些建议,我将尝试更加简洁。

#!/bin/env bash

out1=' ~ "RB"'
out2='&&  ~ "F[0-9]"'
out3='&&  ~ /H*TF/'
printing=''"\t"''

awk_output=$(awk -F, -v o1="$out1" -v o2="$out2" -v o3="$out3" -v p1="$printing" \
    'o1 o2 o3 { print NR,p1}' test.csv)


dialog --title "title" \
    --msgbox "$awk_output" 0 0

上面的代码是我正在尝试编写的一个小程序的示例,它需要一些用户选择的变量,顶部的输出和打印变量。并使用它们对数据库进行 awk 查询。

问题是传递过来的变量字符串包含一个“$3”作为例子。我希望它像往常一样在 awk 中被读取为字段运算符,但它被读取为文字字符串。因此,在打印时,awk 打印文字“$3”而不是它应该在 csv 文件中表示的字段。 我也尝试过 ENVIRON 和 SYMTAB,但收效甚微。有没有人以前也遇到过这种事情? 谢谢,希望也简洁一点。

只是为了澄清当前的输出是这样的:

1   
2   
3   
4   
5   

我希望“$3”在 awk 命令中实际代表 csv 文件的一个字段。这就是我想要得到的东西

1   "info from 3rd field in csv"
2   "info from 3rd field in csv"
3   "info from 3rd field in csv"
4   "info from 3rd field in csv"
5   "info from 3rd field in csv"

一个更简单的方法是,与其将所有带有特殊字符的shell变量传递给awk,我们可以使用printf构建awk命令,然后使用 eval 执行并存储输出。

修改后的脚本:

#!/bin/env bash

out1=' ~ "RB"'
out2='&&  ~ "F[0-9]"'
out3='&&  ~ /H*TF/'
printing='"\t"'

printf -v cmd $'awk -F, \'%s %s %s {print NR, %s}\'' "$out1" "$out2" "$out3" "$printing"
awk_output=$(eval "$cmd" test.csv)

dialog --title "title" \
   --msgbox "$awk_output" 0 0

解释:

  • 已更改 printing='"\t"'。这就是在输出中打印标签所需的全部内容
  • 包括 printf 行。 printf -v cmd $'awk -F, \'%s %s %s {print NR, %s}\'' "$out1" "$out2" "$out3" "$printing"
    • 变量将被替换为 %s 个占位符
    • 注意awk -F, ...前面的$。这是因为 awk 字符串包含 '。要使用文字 ',我们需要在字符串前添加 $

使用的 CSV:

apple,orange,RBF1HTF
apple,orange,RBF2HTF

输出:

I want this to be read as a field operator in awk as it normally is but It is read as a literal string

因此将其作为命令的一部分传递,而不是作为变量...

printing=''
awk -F, -v OFS='\t' "$out1 $out2 $out3 { print NR, $printing}" test.csv

使用 set -x 调试 shell 脚本。请务必阅读 shell 中单引号和双引号的区别以及展开的方式。