2011-03-23 67 views
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 

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

回答

4
awk '{a[$1]=a[$1] FS $2}END{for(i in a) print i,a[i]}' file 

替代红宝石(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 
+0

你的awk的解决方案输出不匹配OP的输出。额外的空间。 – codaddict 2011-03-23 05:41:37

+0

@codeaddict,哇。 – kurumi 2011-03-23 11:23:43

2

使用 '的awk':

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

不使用awk(只是为了好玩):

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

这不会通过我的性能测试:) – kurumi 2011-03-23 04:02:23

+0

@kurumi:为什么不呢? :) – Eelvex 2011-03-23 04:03:16

+0

第一遍,你从文件中'grepped'sid。然后您遍历这些ID,每次再次在这些ID上调用grep。加上链接到'cut'和xargs(额外的进程)。想象一下,如果该文件很大:) – kurumi 2011-03-23 04:11:17

1

在sed中很短(但很神秘):

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

不错,但是,输入需要先排序。 – kurumi 2011-03-23 04:04:38

+0

@kurumi:呃?它已经排序。 – Beta 2011-03-23 04:21:20

0

没有看到任何Perl答案。所以,在这里你去:

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

See it on Ideone

+0

-lnae不容易记住,我更喜欢-lean :) – Dagang 2011-03-24 06:26:54