Skip to main content
$ awk -F': ' ' 
{
             count[$1]++; 
             data[$1] = $1 in data ? data[$1]", "$2 : $2 
            } 
            END { 
                for (id in count) { 
                    printf "%s: ",id; 
                    print (count[id]>1 ? "[ "data[id]" ]" : data[id])
            }
           }' data.txt 
hmz_age: '21'
tom_age: '31'
fd_year_anne: '1987'
school: [ 'anne', 'svp' ]
name: [ 'tom', 'hmz', 'toli' ]
toli_age: '41'
fd_year_svp: '1982'
status_hmz_mar: 'no'
status_tom_mar: 'yes'
$ awk -F': ' '{
             count[$1]++; 
             data[$1] = $1 in data ? data[$1]", "$2 : $2 
            } 
            END{ 
                for(id in count){ 
                    printf "%s: ",id; 
                    print (count[id]>1 ? "[ "data[id]" ]" : data[id])
            }
           }' data.txt 
hmz_age: '21'
tom_age: '31'
fd_year_anne: '1987'
school: [ 'anne', 'svp' ]
name: [ 'tom', 'hmz', 'toli' ]
toli_age: '41'
fd_year_svp: '1982'
status_hmz_mar: 'no'
status_tom_mar: 'yes'
$ awk -F': ' ' 
{
    count[$1]++; 
    data[$1] = $1 in data ? data[$1]", "$2 : $2 
} 
END { 
    for (id in count) { 
        printf "%s: ",id; 
        print (count[id]>1 ? "[ "data[id]" ]" : data[id])
    }
}' data.txt 
hmz_age: '21'
tom_age: '31'
fd_year_anne: '1987'
school: [ 'anne', 'svp' ]
name: [ 'tom', 'hmz', 'toli' ]
toli_age: '41'
fd_year_svp: '1982'
status_hmz_mar: 'no'
status_tom_mar: 'yes'
added 544 characters in body
Source Link
terdon
  • 252.2k
  • 69
  • 480
  • 718

In awk:

$ awk -F': ' '{
             count[$1]++; 
             data[$1] = $1 in data ? data[$1]", "$2 : $2 
            } 
            END{ 
                for(id in count){ 
                    printf "%s: ",id; 
                    print (count[id]>1 ? "[ "data[id]" ]" : data[id])
            }
           }' data.txt 
hmz_age: '21'
tom_age: '31'
fd_year_anne: '1987'
school: [ 'anne', 'svp' ]
name: [ 'tom', 'hmz', 'toli' ]
toli_age: '41'
fd_year_svp: '1982'
status_hmz_mar: 'no'
status_tom_mar: 'yes'

A Perl approach:

A Perl approach:

In awk:

$ awk -F': ' '{
             count[$1]++; 
             data[$1] = $1 in data ? data[$1]", "$2 : $2 
            } 
            END{ 
                for(id in count){ 
                    printf "%s: ",id; 
                    print (count[id]>1 ? "[ "data[id]" ]" : data[id])
            }
           }' data.txt 
hmz_age: '21'
tom_age: '31'
fd_year_anne: '1987'
school: [ 'anne', 'svp' ]
name: [ 'tom', 'hmz', 'toli' ]
toli_age: '41'
fd_year_svp: '1982'
status_hmz_mar: 'no'
status_tom_mar: 'yes'

A Perl approach:

added 656 characters in body
Source Link
terdon
  • 252.2k
  • 69
  • 480
  • 718

Or, a bit easier to understand maybe:

perl -F: -lane '@fields=@F; 
                push @{$key_hash{$fields[0]}},$fields[1]; 
                END{ 
                    for $key (keys(%key_hash)){ 
                        $data=""; 
                        @key_data=@{$key_hash{$key}};
                        if(scalar(@key_data)>1){ 
                           $data="[" . join(",", @key_data) . "]"; 
                        } 
                        else{
                            $data=$key_data[0]
                        }
                        print "$key: $data"
                    }
                }' data.txt 

Or, a bit easier to understand maybe:

perl -F: -lane '@fields=@F; 
                push @{$key_hash{$fields[0]}},$fields[1]; 
                END{ 
                    for $key (keys(%key_hash)){ 
                        $data=""; 
                        @key_data=@{$key_hash{$key}};
                        if(scalar(@key_data)>1){ 
                           $data="[" . join(",", @key_data) . "]"; 
                        } 
                        else{
                            $data=$key_data[0]
                        }
                        print "$key: $data"
                    }
                }' data.txt 
Source Link
terdon
  • 252.2k
  • 69
  • 480
  • 718
Loading