如何在awk中为变量着色

Jpi*_*ike 0 awk colors

我有一个完美的 awk 命令:

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

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

MTRFHLILLPLLFSWFSYCFG_1    1
MLAELSVAFTLAAFALA_rc_1     3
Run Code Online (Sandbox Code Playgroud)

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

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

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

awk -v r=$RED -v n=$NONE '{printf r$1n"\n"}' infile 
Run Code Online (Sandbox Code Playgroud)

我用我上面描述的命令尝试了这个(计算 $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
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

1 #See how the first half of the output (i) is missed and is not coloured. 
3
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Ed *_*ton 7

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

  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='\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
Run Code Online (Sandbox Code Playgroud)

对于您的其他脚本:

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
Run Code Online (Sandbox Code Playgroud)

不清楚为什么将颜色定义为 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
Run Code Online (Sandbox Code Playgroud)

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