The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > Shell Programming and Scripting
.
google unix.com



Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Reading a file and writing the file name to a param file. thebeginer UNIX for Advanced & Expert Users 1 10-05-2007 04:38 PM
Spilt excel file in unix Soumya Dash Shell Programming and Scripting 1 09-25-2006 02:56 AM
Reading file names from a file and executing the relative file from shell script anushilrai Shell Programming and Scripting 4 03-10-2006 05:25 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 11-20-2007
deep_kol deep_kol is offline
Registered User
  
 

Join Date: Jun 2007
Posts: 14
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 (permalink)  
Old 11-20-2007
vgersh99's Avatar
vgersh99 vgersh99 is online now Forum Staff  
Moderator
  
 

Join Date: Feb 2005
Location: Boston, MA
Posts: 5,116
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 (permalink)  
Old 11-20-2007
drl's Avatar
drl drl is offline Forum Advisor  
Registered User
  
 

Join Date: Apr 2007
Location: Saint Paul, MN USA / BSD, CentOS, Debian, OS X, Solaris
Posts: 699
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 (permalink)  
Old 11-20-2007
vgersh99's Avatar
vgersh99 vgersh99 is online now Forum Staff  
Moderator
  
 

Join Date: Feb 2005
Location: Boston, MA
Posts: 5,116
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 (permalink)  
Old 11-20-2007
radoulov's Avatar
radoulov radoulov is online now Forum Staff  
addict
  
 

Join Date: Jan 2007
Location: Варна, България / Milano, Italia
Posts: 2,793
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 (permalink)  
Old 11-20-2007
drl's Avatar
drl drl is offline Forum Advisor  
Registered User
  
 

Join Date: Apr 2007
Location: Saint Paul, MN USA / BSD, CentOS, Debian, OS X, Solaris
Posts: 699
Hi, vgersh99.
Quote:
Originally Posted by vgersh99 View Post
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 ... cheers, drl
  #7 (permalink)  
Old 11-20-2007
deep_kol deep_kol is offline
Registered User
  
 

Join Date: Jun 2007
Posts: 14
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.
Sponsored Links
Closed Thread

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT -4. The time now is 12:29 PM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language translation by Google.
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0