有没有办法使用 awk 汇总单个标识符的第二个字段并用非数字替换输出?

Is there a way to summarize second fields for single identifiers using awk and replace output with nonnumbers?

我有一个 .txt 文件:

a 10
b 13
a 2
b 5
c 1

其中第一列用于标识符,第二列用于值。

如果我想使用 awk 遍历文件并在第二列中为第一列中的每个项目求和数字,然后在打印前用 * 替换它,这样输出如下,我该怎么做关于那个?

a : **
b : **
c : *

这样星星的个数等于数字中的位数(12 -> **, 18 -> **, 1 -> *)

awk '{gsub("12", "**"); print}' test.txt

我已经试过了,但这当然不是正确的解决方案。欢迎任何建议。

能否请您尝试使用显示的示例进行以下、编写和测试。

awk '
FNR==NR{
  arr[]+=
  next
}
( in arr){
  gsub(/./, "*", arr[])
  print , ":", arr[]
  delete arr[]
}
' Input_file Input_file

你可以使用这个 awk:

awk '{sums[] += } END {for (i in sums) {
gsub(/./, "*", sums[i]); print i, ":", sums[i]}}' file

a : **
b : **
c : *

要获取号码的数字长度,请调用 length,例如:

print length(12)

输出:

2

这是一个使用 printf 的可变宽度和精度模式 (%*s) 与 GNU awk 一起工作的示例:

parse.awk

{ h[] +=  }
END {
  for (k in h) {
    padding = sprintf("%*s", length(h[k]), "")
    gsub(/ /, "*", padding)
    print k " : " padding
  }
}

运行 像这样:

awk -f parse.awk infile

输出:

a : **
b : **
c : *