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

Альтернатива 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 
+0

Ваш выход AWK решение не соответствует выход OP еще. Дополнительное пространство. – codaddict

+0

@codeaddict, ничего себе. – kurumi

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

+0

@kurumi: почему бы и нет? :) – Eelvex

+0

Первый проход, вы «grepped» идентификаторы из файла. то вы повторяете эти идентификаторы, каждый раз вызывая grep снова на этих идентификаторах. Плюс привязка к 'cut' и xargs (дополнительные процессы). Представьте, если файл большой :) – kurumi

1

Это короткое (но загадочное) в sed:

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

приятно, но вход необходимо сначала отсортировать. – kurumi

+0

@kurumi: а? Он уже отсортирован. – Beta

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

Смежные вопросы