使用 awk 使变量显示一列

使用 awk 使变量显示一列

我有这个变量:

collumn=2

john我想使用 awk 使其随着从文件开头的行的第二列而改变。

例如,在此文件中sample.txt

bill|copper|real|bruce
john|gold|fake|jhin
johny|silver|geniue|madrit

这不起作用:

collumn=2
awk -F '|' /^jonh/ -v collumn="$2" sample.txt
echo "$collumn"

我想将其打印出来gold

基本上,我想用 awk 改变变量的值。

答案1

您正在使用两种语言:Bash 和 AWK。

猛击你的) 和大王都是编程语言,它们都允许您将数据存储在变量shell 中的变量AWK 中的变量是完全分开的。此外,AWK 脚本完成后,AWK 中的变量将不再存在。也就是说,一旦命令awk运行完毕,AWK 变量就消失了。

您可以将表单文本var=val作为命令行参数awk命令。这将分配一个变量在 AWK 中。它不会以任何方式影响 shell 变量。当您使用选项-v(例如-v var=val)时,它会告诉awk命令在运行 AWK 脚本之前分配变量,但它仍然是 AWK 变量,而不是 shell 变量。

您的目标是将匹配行的特定列中的文本分配给shell 变量。你可以做到。但首先,让我们解决一个更简单的问题。john此命令查找以和开头的行显示器每个此类行的第二列的内容。如果只有一行以此开头,则显示一项。如果没有此类行,则不显示任何内容;如果有多个以 开头的行john,则将在单独的行上显示多项:

awk -F '|' '/^john/ { print $2 }' sample.txt

该命令中的 AWK 脚本是/^john/ {print $2}。我已将其包含在单引号( ' ') 以便将其视为单个字符串,而不是由 shell 修改,然后才传递给awk命令。否则,shell 会将 AWK 脚本解释为五个单独的单词和运算符对于 shell 本身(不是AWK),这将导致它只接受/^john/AWK 脚本。它后面的所有内容都将被视为要传递给 的文件名awk,这是行不通的。shell也会扩张$2并会执行单词拆分文件名扩展(通配符)结果(虽然包含$2双引号就像您的问题中提到的那样,这将阻止拆分和通配)。您不希望发生任何这些事情。通常,最好将 AWK 脚本括在单引号中,以便将它们忠实地传递给命令awk

使用sample.txt 问题中显示的文件,该命令产生以下输出:

gold
silver

它打印两行匹配的文本,而不是一行。由于您只需要gold,因此您可能并不想匹配所有行开始改为john。相反,您可能只想匹配第一列中的条目正是john。(首先解决较简单版本的问题的好处之一是,它可以帮助您完善对要解决的问题的准确了解。)您只能选择第一列条目为确切地 john像这样:

awk -F '|' '$1 == "john" { print $2 }' sample.txt

显示:

gold

现在让我们解决整个问题。在 AWK 脚本中,无法对 shell 变量进行赋值。这不仅不是 AWK 语言的一部分,而且awk命令必须作为 shell 的一部分来实现才能使之成为可能。这并不意味着您不能做您想做的事情——您绝对可以。它只是意味着,您不必尝试编写 AWK 代码来分配给 shell 变量,而是必须使用 shell 本身来执行此操作。

你有一个awk命令可以显示要分配给变量的值。因此你可以使用命令替换在 shell 中帮助您执行赋值。此命令将其分配给名为 的 shell 变量entry(但您可以使用任何您喜欢的名称代替entry,例如column):

entry="$(awk -F '|' '$1 == "john" { print $2 }' sample.txt)"

这是因为 shell取代 $( )以及里面的所有东西输出通过运行其中的命令生成。这是命令替换。请注意,当您分配这样的 shell 变量时,您必须不是标志周围留有空格=

(顺便说一句,您可能会注意到john上面的文本是彩色的,好像它没有被有效引用一样。这实际上是本网站提供语法高亮的软件的一个错误,发生这种情况是因为它没有完全解析 outer 的内容" ",所以它不知道 inner" "在 inside $( )。但是,当您实际运行命令时,这不是问题。)

您可以通过运行以下命令来验证是否gold已分配给entryshell 变量:

echo "$entry"

将显示:

gold

有关 AWK 语言中变量的更多信息,请参阅本节6.1.3 变量Gawk:有效的 AWK 编程,这是 GNU awk 的官方文档(gawk)。虽然它记录了 GNU awk,但它解释了 GNU awk 特有的内容以及 AWK 语言的其他实现中也可以使用的内容。Ubuntuawk系统中的命令可以是mawk或者gawk,具体取决于您安装了什么软件以及您如何配置它。查看哪个软件的方法之一是运行awk -W version

相关内容