如何为awk中的变量上色

  • 本文关键字:变量 awk awk colors
  • 更新时间 :
  • 英文 :


我有一个运行良好的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;31 m

通常,当我想在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. 对于任何包含输入数据的foo,总是执行printf "%s", foo,而不是printf foo,因为当foo包含打印格式字符(如%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

(上面的输出都是红色的,真的!)。

最新更新