我有一个完美的 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)
任何人都可以解释为什么这不起作用并帮助我解决它?
谢谢
由于问题只是关于“它不起作用”的代码而没有说明它以何种方式不起作用,因此这里列出了代码中可能导致它“不起作用”的内容:
r="$RED",不是r=$RED),请参阅https://mywiki.wooledge.org/Quotes。引号是默认情况下必须使用并在需要时删除的内容,而不是在需要时添加的内容。r,i您可以将它们与r i或连接起来(r)(i),但如果您编写ri,那只是另一个名为 的变量ri。printf "%s", foo,不要这样做,因为只要包含打印格式字符,例如.printf foofoofoo%sred='\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)
(上面的所有输出都是红色的,老实说!)。