如何在awk中为变量着色

我有一个完美的 awk 命令:

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

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

MTRFHLILLPLLFSWFSYCFG_1    1
MLAELSVAFTLAAFALA_rc_1     3

我想让输出变成红色。33[01;31m

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

RED='33[01;31m'
NONE='33[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

任何人都可以解释为什么这不起作用并帮助我解决它?

谢谢

回答

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

  1. 始终引用您的 shell 变量(r="$RED",不是r=$RED),请参阅https://mywiki.wooledge.org/Quotes。引号是默认情况下必须使用并在需要时删除的内容,而不是在需要时添加的内容。
  2. 要连接变量,您需要在它们之间留下一些分隔符。给定变量命名ri您可以将它们与r i或连接起来(r)(i),但如果您编写ri,那只是另一个名为 的变量ri
  3. 对于包含输入数据的任何内容,总是这样做printf "%s", foo,不要这样做,因为只要包含打印格式字符,例如.printf foofoofoo%s
  4. 不要对非导出的 shell 变量使用全大写(请参阅更正 Bash 和 shell 脚本变量大写)。
red='33[01;31m'
none='33[0m'

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

对于您的其他脚本:

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

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

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

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


以上是如何在awk中为变量着色的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>