bash合并多行

时间:2011-03-23 03:37:26

标签: bash

我的文件看起来像:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

使用'awk':

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

不使用awk(只是为了它的乐趣):

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

答案 4 :(得分:0)

没有看到任何Perl答案。所以你走了:

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

See it on Ideone