我有一个运行良好的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
谁能解释一下为什么这个不能工作并帮助我修复它?
谢谢
既然问题只是说代码"它不起作用"在不说明它无法工作的原因的情况下,这里列出了代码中可能导致它"无法工作"的事情:
- 始终引用您的shell变量(
r="$RED"
,而不是r=$RED
),参见https://mywiki.wooledge.org/Quotes。引号是默认情况下你必须使用并在需要时删除的东西,而不是在需要时添加的东西。 - 要连接变量,需要在变量之间留一些分隔符他们。给定名为
r
和i
的变量,您可以将它们连接起来用r i
或(r)(i)
,但如果你写ri
,那只是另一个变量名为ri
. - 对于任何包含输入数据的
foo
,总是执行printf "%s", foo
,而不是printf foo
,因为当foo
包含打印格式字符(如%s
)时,后者将失败。 - 对于非导出的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 = "