How to spilt a file


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to spilt a file
# 1  
Old 11-20-2007
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 !!
# 2  
Old 11-20-2007
nawk -f deep.awk abc.txt

deep.awk:
Code:
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)
}

# 3  
Old 11-20-2007
Hi.

Command csplit was designed for this:
Code:
#!/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:
Code:
% ./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
# 4  
Old 11-20-2007
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!
# 5  
Old 11-20-2007
Another one:

Code:
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:

Code:
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.

Last edited by radoulov; 11-20-2007 at 06:38 PM.. Reason: ps
# 6  
Old 11-20-2007
Hi, vgersh99.
Quote:
Originally Posted by vgersh99
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!
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 Smilie ... cheers, drl
# 7  
Old 11-20-2007
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.
Login or Register to Ask a Question

Previous Thread | Next Thread

6 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Shell script (sh file) logic to compare contents of one file with another file and output to file

Shell script logic Hi I have 2 input files like with file 1 content as (file1) "BRGTEST-242" a.txt "BRGTEST-240" a.txt "BRGTEST-219" e.txt File 2 contents as fle(2) "BRGTEST-244" a.txt "BRGTEST-244" b.txt "BRGTEST-231" c.txt "BRGTEST-231" d.txt "BRGTEST-221" e.txt I want to get... (22 Replies)
Discussion started by: pottic
22 Replies

2. Shell Programming and Scripting

Compare 2 text file with 1 column in each file and write mismatch data to 3rd file

Hi, I need to compare 2 text files with around 60000 rows and 1 column. I need to compare these and write the mismatch data to 3rd file. File1 - file2 = file3 wc -l file1.txt 58112 wc -l file2.txt 55260 head -5 file1.txt 101214200123 101214700300 101250030067 101214100500... (10 Replies)
Discussion started by: Divya Nochiyil
10 Replies

3. Shell Programming and Scripting

Match list of strings in File A and compare with File B, C and write to a output file in CSV format

Hi Friends, I'm a great fan of this forum... it has helped me tone my skills in shell scripting. I have a challenge here, which I'm sure you guys would help me in achieving... File A has a list of job ids and I need to compare this with the File B (*.log) and File C (extend *.log) and copy... (6 Replies)
Discussion started by: asnandhakumar
6 Replies

4. AIX

How to spilt huge string in AIX ?

I have few AIX 5.3 boxes where following is the issue. I have a variable whose value is a very huge string ...(5000+ characters) CMD_ARGS="/global/site/vendor/WAS/WebSphere6/AppServer/java/bin/java... (7 Replies)
Discussion started by: ak835
7 Replies

5. Shell Programming and Scripting

Spilt the line into two....

Hello Guys /usr/local/sbin/sshd I need to spilt such a line like this Path to be set as :/usr/local/sbin Command to be set as : sshd What combination should i use? Regards Abhi (21 Replies)
Discussion started by: ak835
21 Replies

6. Shell Programming and Scripting

Spilt excel file in unix

Hi friends... I am sending a file say xyz.xls to a mail through unix. The .xls file is more than 65 thousand in size so I want to spilt the file size into 40 thousand and 25 thousand. So can anyone provide any inputs.... (1 Reply)
Discussion started by: Soumya Dash
1 Replies
Login or Register to Ask a Question