2011-03-23 68 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