如何在awk中为变量着色

如何在awk中为变量着色,awk,colors,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 RED='\033[01;31m' NONE='\033[0m' awk -v r=$RED -v n=$NONE '{printf r$1n&

我有一个工作完美的awk命令:

awk '{a[$1]++}END{for(i in a){printf i"\t"a[i]"\n"}}' infile
它以1美元计算重复次数。输出如下所示:

MTRFHLILLPLLFSWFSYCFG_1    1
MLAELSVAFTLAAFALA_rc_1     3
RED='\033[01;31m'
NONE='\033[0m'

awk -v r=$RED -v n=$NONE '{printf r$1n"\n"}' infile 
1 #See how the first half of the output (i) is missed and is not coloured. 
3
我想把输出变成红色\033[01;31米

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

MTRFHLILLPLLFSWFSYCFG_1    1
MLAELSVAFTLAAFALA_rc_1     3
RED='\033[01;31m'
NONE='\033[0m'

awk -v r=$RED -v n=$NONE '{printf r$1n"\n"}' infile 
1 #See how the first half of the output (i) is missed and is not coloured. 
3
我用上面描述的命令尝试了这一点(计算$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
输出如下所示:

MTRFHLILLPLLFSWFSYCFG_1    1
MLAELSVAFTLAAFALA_rc_1     3
RED='\033[01;31m'
NONE='\033[0m'

awk -v r=$RED -v n=$NONE '{printf r$1n"\n"}' infile 
1 #See how the first half of the output (i) is missed and is not coloured. 
3
有人能解释一下为什么这不起作用,并帮我修复它吗


谢谢

因为问题只是说代码“不起作用”,而没有说它以什么方式不起作用,下面列出了代码中可能导致它“不起作用”的因素:

  • 始终引用您的shell变量(
    r=“$RED”
    ,而不是
    r=$RED
    ),请参见。默认情况下,引号是您必须使用并在需要时删除的,而不是在需要时添加的
  • 要连接变量,需要在变量之间留一些分隔符 给定名为
    r
    i
    的变量,可以将它们串联起来 用
    ri
    (r)(i)
    ,但如果你写
    ri
    ,那只是另一回事 变量名为
    ri
  • 对于任何包含输入数据的
    foo
    ,始终执行
    printfoo“%s”,foo
    ,而不是
    printfoo
    ,因为只要
    foo
    包含打印格式字符,例如
    %s
    ,后者就会失败
  • 对于非导出的shell变量,不要使用所有大写字母(请参见)
  • 对于您的其他脚本:

    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
    

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

    它不工作
    是最糟糕的问题陈述,因为它没有告诉我们任何关于调试问题的有用信息。还有该陈述所指的脚本,
    awk-vr=$red-vn=$NONE'{printfr$1n'\n}“infle
    ,实际上起到了误导作用,只是你问题后面的脚本不起作用。谢谢你的帮助-非常感谢。抱歉,我应该更清楚地说明代码在哪些方面不起作用。由于你修改了你的答案,表明我写问题的方式不正确,我将离开解决方案2解决了这个问题,所以我认为问题在于变量的串联。但是,通过阅读链接等,我使用的方法似乎不正确/实践不佳。从现在开始,我将尝试正确地做事情。Thanks:)