如何在扩展变量时将 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 中单引号和双引号的区别以及展开的方式。
因此,由于这些建议,我将尝试更加简洁。
#!/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 中单引号和双引号的区别以及展开的方式。