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)
}
drl
November 20, 2007, 1:42pm
3
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.
drl
November 20, 2007, 6:23pm
6
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 ... 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...