Split a single file into multiple files based on a value.

Hi All,

I have the sales_data.csv file in the directory as below.

SDDCCR;  SOM   ; MD6546474777   ;05-JAN-16
ABC   ;  KIRAN ; CB789          ;04-JAN-16
ABC   ;  RAMANA; KS566767477747 ;06-JAN-16
ABC   ;  KAMESH; A33535335      ;04-JAN-16
SDDCCR;  DINESH; GD6674474747   ;08-JAN-16
SDDCCR;  SUJAN ; SA6666464664646;05-JAN-16
XYZ  ;   AMAR  ; AB123456       ;04-JAN-16
XYZ  ;   RAJ   ; CS78890        ;04-JAN-16
XYZ  ;   GANE  ; MD6546474777   ;08-JAN-16
XXX  ;   MANO  ; MD6546474777   ;04-JAN-16

I want to split the file as below based on last column value.

sales_data04-JAN-16.csv

ABC   ;  KIRAN ; CB789          ;
ABC   ;  KAMESH; A33535335      ;
XYZ  ;   AMAR  ; AB123456       ;
XYZ  ;   RAJ   ; CS78890        ;
XXX  ;   MANO  ; MD6546474777   ;

sales_data05-JAN-16.csv

SDDCCR;  SOM   ; MD6546474777   ;
SDDCCR;  SUJAN ; SA6666464664646;

sales_data06-JAN-16.csv

ABC   ;  RAMANA; KS566767477747 ;

sales_data08-JAN-16.csv

SDDCCR;  DINESH; GD6674474747   ;
XYZ  ;   GANE  ; MD6546474777   ;

I have tried the following script but its working.

#!/bin/ksh 
file_name=sales_data.csv
file_format=$4
awk ' NR==1 {HD = $1 OFS $2  OFS $3; next; next} {FN = DIR"/sales_data"  file_out 
                 if (!(Se[FN]++)) print HD > FN
                 print  $1, $2, $3 >  FN}' FS=' *; *' OFS=";" DIR="$SAL_DIR" file_out="$file_format" $SAL_DIR/$file_name
if [ $? -ne 0 ]
then
  echo "report generation failed"
  fin_anormale $0
fi

#End of File

Please help me.

Thanks.

---------- Post updated at 07:04 PM ---------- Previous update was at 06:31 PM ----------

Sorry I forgot.Please help me.

---------- Post updated at 07:27 PM ---------- Previous update was at 07:04 PM ----------

Hi All,

Please help me ASAP.

Thanks.

ASAP is a highly deprecated term in these forums.

---------- Post updated at 16:24 ---------- Previous update was at 16:19 ----------

How about

awk -F";" '{print > "sales_data" $4 ".csv"}' file
1 Like

$4 should not be included:

awk -F\; '{f= "sales_data" $4 ".csv"; $4=""; print > f}' OFS=\; file

hi

awk 'BEGIN{FS=OFS=";"} FNR==NR{a[$4]=$4;next} $4 in a{print $1 OFS $2 OFS $3 ";" >> "sales_date"a[$4]".csv" }' file file

---------- Post updated at 03:01 PM ---------- Previous update was at 02:30 PM ----------

Or

awk -F";" '{print $1";"$2";"$3 > "sales_data" $4 ".csv"}' file

Hi All,

Thanks a lot to all.

I forgot to mention one thing the sales_data.csv is having heading.

SCID     NAME     SCODE           CREATE_DATE
SDDCCR;  SOM   ; MD6546474777   ;05-JAN-16
ABC   ;  KIRAN ; CB789          ;04-JAN-16
ABC   ;  RAMANA; KS566767477747 ;06-JAN-16
ABC   ;  KAMESH; A33535335      ;04-JAN-16
SDDCCR;  DINESH; GD6674474747   ;08-JAN-16
SDDCCR;  SUJAN ; SA6666464664646;05-JAN-16
XYZ  ;   AMAR  ; AB123456       ;04-JAN-16
XYZ  ;   RAJ   ; CS78890        ;04-JAN-16
XYZ  ;   GANE  ; MD6546474777   ;08-JAN-16
XXX  ;   MANO  ; MD6546474777   ;04-JAN-16

I need heading for every split file as below.

sales_data04-JAN-16.csv

SCID     NAME     SCODE  
ABC   ;  KIRAN ; CB789          ;
ABC   ;  KAMESH; A33535335      ;
XYZ  ;   AMAR  ; AB123456       ;
XYZ  ;   RAJ   ; CS78890        ;
XXX  ;   MANO  ; MD6546474777   ;

sales_data05-JAN-16.csv

SCID     NAME     SCODE        
SDDCCR;  SOM   ; MD6546474777   ;
SDDCCR;  SUJAN ; SA6666464664646;

sales_data06-JAN-16.csv

SCID     NAME     SCODE    
ABC   ;  RAMANA; KS566767477747 ;

sales_data08-JAN-16.csv

SCID     NAME     SCODE     
SDDCCR;  DINESH; GD6674474747   ;
XYZ  ;   GANE  ; MD6546474777   ;

My below script is working fine apart from ganerating one more saparate file for heading
and not giving heading in all split files.

#!/bin/ksh 
file_name=sales_data.csv
awk ' NR==4 {HD = $1 OFS $2  OFS $3; next; next} {FN = DIR"/sales_data_"$4".csv"  file_out 
                 if (!(Se[FN]++)) print HD > FN
                 print  $1, $2, $3 >  FN}' FS=' *; *' OFS=";" DIR="$SAL_DIR" file_out $SAL_DIR/$file_name
if [ $? -ne 0 ]
then
  echo "report generation failed"
  fin_anormale $0
fi

Please help me.

Thanks.