Combining rows of data

Viewed 82

File.csv

1234,1  
6789,1

I'm trying to transform the file above to the below output :

1234,1  
6789,1

Looking to merge rows using array or loop

2 Answers

Could you please try following, written and tested with shown samples in GNU awk.

awk '
BEGIN{
  FS=OFS=","
}
{
  sub(/ +$/,"")
  first=$1
  sub(/^[^,]*,/,"")
  arr[first]=(arr[first]?arr[first] OFS:"")$0
}
END{
  for(i in arr){
    print i,arr[i]
  }
}' Input_file

Explanation: Adding detailed explanation for above solution:

awk '                                               ##Starting awk program from here.
BEGIN{                                              ##Starting BEGIN section from here.
  FS=OFS=","                                        ##Setting field separator and output field separator as , here.
}
{
  sub(/ +$/,"")                                     ##Substituting spaces coming at last of line with NULL OP samples have it.
  first=$1                                          ##Setting $1 value to first variable here.
  sub(/^[^,]*,/,"")                                 ##Substituting everything till first , with NULL here.
  arr[first]=(arr[first]?arr[first] OFS:"")$0       ##Creating array arr with index of first and keep on adding values to it.
}
END{                                                ##Starting END block of this awk program from here.
  for(i in arr){                                    ##Traversing through arr here for all elements here.
    print i,arr[i]                                  ##Printing i and value of arr with index of i here.
  }
}' Input_file                                       ##Mentioning Input_file name here.

One way, using a perl one-liner:

$ perl -F, -lanE '
    push @{$g{$F[0]}}, @F[1..$#F];
    END { print join(",", $_, $g{$_}->@*) for (sort { $a <=> $b } keys %g) }
  ' input.csv
1234,1,5,No,4,1,Not Applicable,2,5,6,8,6,1,3  
6789,1,5,No,4,1,Not Applicable,2,5,6,8,6,1,3

Splits lines on commas, and adds all the fields to arrays stored in a hash table using the first element as the key, and then prints out all the combined lines in sorted order.

Related