【问题标题】:How do I make the Awk work with Bash array variables in a shell script?如何让 Awk 在 shell 脚本中使用 Bash 数组变量?
【发布时间】:2021-08-13 05:42:57
【问题描述】:
user=(`cat < usernameSorted.txt`)
for (( i=0; i<${#user[@]}; i++ ))
do
    `awk '$1 == "${user[$i]}"{print $NF}' process.txt > CMD$i.txt`
done

这就是我使用用户数组元素作为 awk 说明符的编码方式。如何将 ${user[$i]} 插入 AWK 命令。

【问题讨论】:

  • “工作”和“限制范围”是什么意思?你想做什么?除非您能够澄清您的问题以及您期望发生什么以及没有发生什么,否则您的问题将被关闭。请查看how to ask
  • 欢迎来到 SO!请使用tour 并阅读How to Ask。您是在问如何将${user[$i]} 插入到 AWK 命令中,对吗?请edit 澄清。对于调试帮助,将minimal reproducible example 包含在示例输入、所需输出和实际输出(如错误)中确实很有帮助。
  • 您的 awk 脚本用单引号括起来;您的 shell 变量不会在单引号内展开。您可能需要使用 awk -v user="${user[$i]}" '…program…' process.txt &gt; "CMD$i.txt" 主题的变体,在该主题中,您将在命令行上将 user 称为从 "${user[$i]}" 设置的 Awk 变量。
  • 一般来说,要对 shell 变量使用 awk(或 sed、grep 或任何其他过滤器),您需要通过过滤器管道回显变量。因此,您的 awk 行看起来更像 >> echo ${user[i]} | awk 'xxxxxxxx') (其中 xxxxxxxx 是您的 awk 命令

标签: linux shell ubuntu awk


【解决方案1】:

正如我在comment 中指出的,您的 Awk 脚本用单引号括起来;您的 shell 变量不会在单引号内展开。总的来说,这很好; $NF 不是您的 shell 变量之一。

您可能需要使用以下主题的变体:

awk -v user="${user[$i]}" '$1 == user { print $NF }' process.txt > "CMD$i.txt"

您将user 称为在命令行上从"${user[$i]}" 设置的Awk 变量。


脚本中还有其他一些奇怪之处。 &lt; 不是cat 所必需的。您可以使用以下方法避免 Bash 数组:

i=0
for user in $(cat usernameSorted.txt)
do
    awk -v user="$user" '$1 == user { print $NF }' process.txt > "CMD$i.txt"
    ((i++))
done

您不希望 Awk 命令周围出现反引号。幸运的是,您将标准输出重定向到一个文件,因此执行的字符串为空,没有任何反应。

【讨论】:

    猜你喜欢
    • 2022-01-18
    相关资源
    最近更新 更多