有没有办法使用 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 : *
我有一个 .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 : *