【问题标题】:How to colour a variable in awk如何在awk中为变量着色
【发布时间】:2021-06-08 10:26:39
【问题描述】:

我有一个运行良好的 awk 命令:

awk '{a[$1]++}END{for(i in a){printf i"\t"a[i]"\n"}}' infile

它计算 $1 中的重复次数。输出如下所示:

MTRFHLILLPLLFSWFSYCFG_1    1
MLAELSVAFTLAAFALA_rc_1     3

我想让输出变为红色。 \033[01;31m

通常,当我想在 awk 中为输出着色时,我会这样做:

RED='\033[01;31m'
NONE='\033[0m'

awk -v r=$RED -v n=$NONE '{printf r$1n"\n"}' infile 

我用上面描述的命令尝试了这个(计算 $1 中的重复次数),但它不起作用。我认为这是因为 awk 无法将 r 和 i 识别为单独的变量,例如,在 bash 中我会使用 $r$i。是这样吗?

这是我尝试过的命令:

awk -v r=$RED -v n=$NONE '{a[$1]++}END{for(i in a){printf ri"\t"a[i]"\n"n}}' infile

输出如下:

1 #See how the first half of the output (i) is missed and is not coloured. 
3

谁能解释为什么这不起作用并帮助我解决它?

谢谢

【问题讨论】:

  • it doesn't work 是最糟糕的问题陈述,因为它没有告诉我们任何有用的问题来调试它。此外,该语句引用的脚本awk -v r=$RED -v n=$NONE '{printf r$1n"\n"}' infile 实际上确实有效,这具有误导性,只是您问题后面的脚本无效。

标签: awk colors


【解决方案1】:

由于问题只是说“它不起作用”的代码而没有说明它以什么方式不起作用,这里列出了代码中可能导致它“不起作用”的内容:

  1. 始终引用您的 shell 变量(r="$RED",而不是 r=$RED),请参阅 https://mywiki.wooledge.org/Quotes。引号是您必须默认使用并在需要时删除的东西,而不是在需要时添加的东西。
  2. 要连接变量,您需要在它们之间留一些分隔符 他们。给定名为 ri 的变量,您可以将它们连接起来 与r i(r)(i),但如果你写ri 那只是另一个 名为 ri 的变量。
  3. 对于任何包含输入数据的foo,始终使用printf "%s", foo,而不是printf foo,因为只要foo 包含诸如%s 之类的打印格式字符,后者就会失败。
  4. 不要对未导出的 shell 变量使用全大写(请参阅Correct Bash and shell script variable capitalization)。
red='\033[01;31m'
none='\033[0m'

seq 3 | awk -v r="$red" -v n="$none" '{printf "%s%s%s\n", r, $1, n}'
1
2
3

对于您的其他脚本:

seq 3 | awk -v r="$red" -v n="$none" '{a[$1]++}END{for(i in a){printf "%s%s\t%s%s\n", r, i, a[i], n}}'
1       1
2       1
3       1

不明白为什么要将颜色定义为 shell 变量并将这些值传递给 awk 而不是仅仅在 awk 中定义它们:

seq 3 | awk '
    BEGIN {
        red  = "\033[01;31m"
        none = "\033[0m"
    }
    { printf "%s%s%s\n", red, $1, none }
'
1
2
3

(上面的所有输出都是红色的,老实说!)。

【讨论】:

  • 感谢您的帮助 - 非常感谢。抱歉,我应该更清楚地说明代码不起作用的方式。由于您已修改答案以表明我写问题的方式不正确,因此我将保留原样,以便其他人可以从我的错误中吸取教训。解决方案 2 解决了这个问题,所以我认为问题是变量的串联。但是,通过阅读链接等,似乎我一直在使用的方法,虽然它们有效,但不正确/糟糕的做法。从现在开始,我会努力正确地做事。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2019-01-17
  • 2015-06-02
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
相关资源
最近更新 更多