Bash concatenate multiple lines

I have a file:

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

I want to format it as:

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

Can someone give me a solution? Thanks!

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

Alternative 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 
+4
source

Using 'awk':

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

It is short (but cryptic) in sed:

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

Without using awk (just for fun):

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

Did not see any answers to Perl. So you go:

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

Look at ideone

0
source

Source: https://habr.com/ru/post/1344868/


All Articles