Bhanu Prakash
Bhanu Prakash

Reputation: 41

how to split the data in the unix file

I've a file in Unix (solaris) system with data like below

[TYPEA]:/home/typeb/file1.dat
[TYPEB]:/home/typeb/file2.dat
[TYPEB]:/home/typeb/file3.dat
[TYPE_C]:/home/type_d/file4.dat
[TYPE_C]:/home/type_d/file5.dat
[TYPE_C]:/home/type_d/file6.dat

I want to separate the headings like below

[TYPEA]
/home/typeb/file1.dat
[TYPEB]
/home/typeb/file2.dat
/home/typeb/file3.dat
[TYPE_C]
/home/type_d/file4.dat
/home/type_d/file5.dat
/home/type_d/file6.dat

Files with similar type have to come under one type. Please help me with any logic to achieve this without hardcoding.

Upvotes: 2

Views: 69

Answers (3)

Tiago Lopo
Tiago Lopo

Reputation: 7959

If you can use perl you will be able to make use of hashes to create a simple data structure:

#! /usr/bin/perl
use warnings;
use strict;

my %h; 

while(<>){
  chomp;
  my ($key,$value) =  split /:/;
  $h{$key} = [] unless exists $h{$key};
  push ${h{$key}},$value;

}


foreach my  $key (sort keys %h) {
  print "$key"."\n";
  foreach my $value (@{$h{$key}}){
    print "$value"."\n";
  }
}

In action:

perl script.pl file
[TYPEA]
/home/typeb/file1.dat
[TYPEB]
/home/typeb/file2.dat
/home/typeb/file3.dat
[TYPE_C]
/home/type_d/file4.dat
/home/type_d/file5.dat
/home/type_d/file6.dat

If you like it, there is a wholeTutorial to solve this simple problem. It's worth reading it.

Upvotes: 0

NeronLeVelu
NeronLeVelu

Reputation: 10039

sed 'H;$ !b
x
s/\(\(\n\)\(\[[^]]\{1,\}]\):\)/\1\2\1/g
:cycle
=;l
s/\(\n\[[^]]\{1,\}]\)\(.*\)\1/\1\2/g
t cycle
s/^\n//' YourFile

Posix sed version a bit unreadeable due to presence of [ in pattern - allow : in label or file/path - failed if same label have a line with another label between them (sample seems ordered).

Upvotes: 2

tripleee
tripleee

Reputation: 189377

Assuming the input is sorted by type like in your example,

awk -F : '$1 != prev { print $1 } { print $2; prev=$1 }' file

If there are more than 2 fields you will need to adjust the second clause.

Upvotes: 5

Related Questions