How to spilt a file

Hi ,
I have a file,abc.txt. like

abc.txt

KOKRS EL01 RLDNR M2 RRCTY 1
Company Code 100
Fiscal Year 2007
Version PW3
Currency USD
1 2 3 4
1 2 3 4
BA Account number Profit Ctr MRA Jan-TC Feb-TC
A 93010000 1530 152 1429793
A 93010000 9999 403 0 0 0
A 93010000 9999 404 -142
A 93010000 9999 411 0 0 0
A 93010000 9999 465 214538 214538 6114330
A 93010000 9999 487 0 -207918
A 93010000 471 502 0 0 0
A 93010000 9999 502 0 0 0

KOKRS EL01 RLDNR M2 RRCTY 1
Company Code 152
Fiscal Year 2007
Version PW3
Currency GBP
1 2 3 4
1 2 3 4
BA Account number Profit Ctr MRA Jan-TC Feb-TC
A 93010000 1200 152 0 0 0
A 93010000 9999 152 -57885 -16511 -537549
KOKRS EL01 RLDNR M2 RRCTY 1
.......
.....500 lines like this

I have to spilt this file into diffrent files according to the company code.

ex :

abc_COMCODE_100.txt

KOKRS EL01 RLDNR M2 RRCTY 1
Company Code 100
Fiscal Year 2007
Version PW3
Currency USD
1 2 3 4
1 2 3 4
BA Account number Profit Ctr MRA Jan-TC Feb-TC
A 93010000 1530 152 1429793
A 93010000 9999 403 0 0 0
A 93010000 9999 404 -142
A 93010000 9999 411 0 0 0
A 93010000 9999 465 214538 214538 6114330
A 93010000 9999 487 0 -207918
A 93010000 471 502 0 0 0
A 93010000 9999 502 0 0 0

abc_COMCODE_152.txt

KOKRS EL01 RLDNR M2 RRCTY 1
Company Code 152
Fiscal Year 2007
Version PW3
Currency GBP
1 2 3 4
1 2 3 4
BA Account number Profit Ctr MRA Jan-TC Feb-TC
A 93010000 1200 152 0 0 0
A 93010000 9999 152 -57885 -16511 -537549

Kindly suggest me how to spilt it through Unix shell program.

Thanks in advance !!

nawk -f deep.awk abc.txt

deep.awk:

BEGIN {
  FS=RS=""

  prefix=substr(FILENAME, 1, index(FILENAME, ".")-1)
}
{
   root="unknown"
   for(i=1; i<=NF; i++)
      if ($i ~ "Company Code") {
         n=split($2, a, " ")
         root=a[n]
         break
      }
   out= prefix "_COMCODE_" root ".txt"
   print > out
   close(out)
}

Hi.

Command csplit was designed for this:

#!/usr/bin/env sh

# @(#) s1       Demonstrate context split, csplit.

set -o nounset
echo

debug=":"
debug="echo"

## Use local command version for the commands in this demonstration.

echo "(Versions displayed with local utility \"version\")"
version >/dev/null 2>&1 && version bash csplit

echo

# Remove debris files.
rm -f xx*

FILE=${1-data1}

csplit --keep-files -z $FILE "/Company Code/-1" {*}

echo
echo " Files created:"
ls xx*

SAMPLE=xx01
echo
echo " Sample $SAMPLE:"
cat -n $SAMPLE

exit 0

Producing:

% ./s1

(Versions displayed with local utility "version")
GNU bash 2.05b.0
csplit (coreutils) 5.2.1

1
379
218
81

 Files created:
xx00  xx01  xx02  xx03

 Sample xx01:
     1  KOKRS EL01 RLDNR M2 RRCTY 1
     2  Company Code 100
     3  Fiscal Year 2007
     4  Version PW3
     5  Currency USD
     6  1 2 3 4
     7  1 2 3 4
     8  BA Account number Profit Ctr MRA Jan-TC Feb-TC
     9  A 93010000 1530 152 1429793
    10  A 93010000 9999 403 0 0 0
    11  A 93010000 9999 404 -142
    12  A 93010000 9999 411 0 0 0
    13  A 93010000 9999 465 214538 214538 6114330
    14  A 93010000 9999 487 0 -207918
    15  A 93010000 471 502 0 0 0
    16  A 93010000 9999 502 0 0 0
    17

See man csplit for details ... cheers, drl

it must be a GNU-ed csplit - does not fly on Solaris.
Plus the naming convention for created files is not what the OP wanted.
Cool idea though - like it!

Another one:

awk 'FNR == 1 {
	pfx = substr(FILENAME, 1, 3) "_COMCODE_"
	}	
/^KOKRS/ {
	fn = 0
}
/^Company Code/ {
	close(fn)
	fn = pfx $3 ".txt"
	$0 = prev RS $0
	}
fn {
	print > fn
}
{
	prev = $0
}' abc.txt

Use nawk on Solaris.

With some Awk implementations (like XPG Awk on Solairs),
you should be more explicit:

awk 'FNR == 1 {
	pfx = substr(FILENAME, 1, 3) "_COMCODE_"
	}	
/^KOKRS/ {
	fn = 0
}
/^Company Code/ {
	close(fn)
	fn = pfx $3 ".txt"
	$0 = prev RS $0
	}
fn != 0 {
	print > fn
}
{
	prev = $0
}' abc.txt

P.S. vgersh99's prefix makes more sense, of course.

Hi, vgersh99.

Thanks for the heads-up. Yes, it's GNU-coreutils csplit. I'm sure that back when I was using Solaris daily that csplit was available. If it didn't work, how did it fail?

I tried it on a FreeBSD 4.11 system, and it has only an anemic split with a pattern-match added on, but no csplit (nor does it exist on OS X). The GNU-long options can usually be replaced with single-dash options.

It would take another process to extract the string to make the filename, but that's a good exercise for the OP :slight_smile: ... cheers, drl

Hi Friends,
Thanks for your help .
I am novice to Unix . I am working in ksh and csh .
now can youuplease explain how to execute that.
abc.txt is my file name.

drl your solution looks to be okay . but I am not able to execute it.

Hi,

Try this one.

code:

nawk '
{
if ($0 ~ /Company Code/)
{
	flag=1
	file=sprintf("abc_COMCODE_%s.txt",$3)
	print "KOKRS EL01 RLDNR M2 RRCTY 1" >> file
	close(file)
}
if ($0 ~ /KOKRS/)
	flag=0
if (flag==1)
{
	print >> file
	close(file)
}
}' abc.txt

Thanks Guys for help .
Thanks summer_cherry,

It is really working...:b: