A: XXX (Done after 2 rounds)
A: YYY (Done after 1 rounds)
A: ZZZZ (Done after 4 rounds)
A: XXX (Done after 2 rounds)
A: ZZZZ (Done after 1 rounds)
A: YYY (Done after 2 rounds)
A: YYY (Done after 1 rounds)
对于上述文件,我想提取某些名称,例如XXX,YYY,ZZZZ以及每个名字的轮数。
最后,我期望的结果是:
XXX 2 2
YYY 1 2 1
ZZZZ 4 1
我觉得我应该使用sed或awk,但不知道如何使用它们。有没有人有好的解决方案?非常感谢。
答案 0 :(得分:5)
awk '{ names[$2] = names[$2] " " $5; } END { for (name in names) print name " " names[name] }' file
<强>解释强>
每个输入行都传递给命令names[$2] = names[$2] " " $5
,该命令创建一个名为names
的数组,其索引不是数字 - 它们是输入行中显示为第二个字段的单词: XXX
,YYY
和ZZZZ
。它们的值在每行的第5个字段中累积相应的数字。
当输入文件用完时,END
会遍历索引名称,打印每个名称后跟其累计数字字符串。
答案 1 :(得分:1)
我喜欢这样的Perl数据结构(数组的哈希):
perl -lane '
push @{$packets{$F[1]}}, $F[4]
}
END {
foreach $name (keys %packets) {print join(" ", $name, @{$packets{$name}})
}
'
答案 2 :(得分:0)
这可能对您有用:
cut -d' ' -f2,5 file |
sort -sk1,1 |
sed ':a;$!N;s/^\(\(\S\+\).*\)\n\2/\1/;ta;P;D'
XXX 2 2
YYY 1 2 1
ZZZZ 4 1
说明:
XXX 2
cut -d' ' -f2,5 file
上的字段2和5
sort -sk1,1
sed ':a;$!N;s/^\(\(\S\+\).*\)\n\2/\1/;ta;P;D'
Ths sed命令的工作原理如下:
:a
$!N
s/^\(\(\S\+\).*\)\n\2/\1/
ta
P
D