合并多行的 Bash 命令

4

我有一个文件,看起来像这样:

id001 success:100
id002 success:99
id002 failed:1
id003 failed:100
id004 success:50
id004 failed:50
我希望将其格式化为:

我想将它格式化为:

id001 success:100
id002 success:99 failed:1
id003 failed:100
id004 success:50 failed:50

有人可以给我一个解决方案吗?谢谢!

5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4
awk '{a[$1]=a[$1] FS $2}END{for(i in a) print i,a[i]}' file

替代Ruby(1.9+)

$ ruby -ane 'BEGIN{a=Hash.new};a[$F[0]]="#{a[$F[0]]} #{$F[1]}"; END{ a.each{|x,y| puts "#{x}#{y}" }}' file

你的awk解决方案的输出与OP的输出不匹配。多了一个空格。 - codaddict

2

使用'awk':

awk '{line[$1] = line[$1] " " $2}
     END { for (id in line) { printf "%s%s\n", id, line[id] } }'

1

在sed中,它很短(但晦涩):

sed '$!N;/^\([^ ]*\) .*\n\1/{s/\n[^ ]* / /;};P;D' file

不错,但是输入需要先排序。 - kurumi

0

为了好玩,不使用 awk

for i in `grep -o "id[0-9]*" myfile`; do
   echo -n "$i "
   grep $i myfile | cut -c 7- |xargs
done | uniq

首先,您从文件中使用 grep 提取了 ID。然后,您遍历这些 ID,每次在这些 ID 上再次调用 grep。此外,还需要链接到 cutxargs(额外的进程)。想象一下如果文件很大 :) - kurumi
@kurumi:那是个修辞问题 :) 不过我可以将uniq移到第一个grep中 :p - Eelvex
你每次迭代 id 都在再次调用 grep。就像我之前说的,如果你的 myfile 很大,并且有几个 id(例如 100 个唯一的 id)需要处理,那么你会在那个大文件上调用 100 次 grep... :) - kurumi

0

没有看到任何Perl的答案。所以这里是:

perl -lnae '$h{$F[0]}.="$F[1] ";END{print "$_ $h{$_}"for(sort keys %h)}' file

在 Ideone 上查看


-lnae 不容易记住,我更喜欢 -lean :) - Dagang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,