split file with condition


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting split file with condition
# 1  
Old 04-28-2009
split file with condition

Code:
$ cat file
H1:12:90
k:12:b
n:22:i
k:54:b
k:42:b
s:48:s
a:41:b
t:18:n
c:77:a

I am trying to split above file based on $2 such that if $2 is rounded to nearest 10's multiple (e.g. 10,20,30 etc), each sub file should contain 3 multiples and so on (also I want to keep header i.e. NR==1, in all splitted files)

i.e. above file will be slitted to:
Code:
file1 (here $2 rounded to 10,20,40 are present)
-----
H1:12:90
k:12:b
t:18:n
n:22:i
k:42:b
s:48:s
a:41:b

file2 (remaining 50,70)
-----
H1:12:90
k:54:b
c:77:a

I was trying this:
Code:
$ awk -F ":" 'NR==1{header=$0}{close(F); print header > int($2/10)*10 } {print > (F=int($2/10)*10)}' file

# 2  
Old 04-28-2009
nawk -f u.awk myFile

u.awk:
Code:
BEGIN {
  FS=OFS=":"
}
FNR==1 {header=$0;next}
{
  f="u" int($2/30) ".txt"
  if (!a[f]) print header >f
  a[f]++
  print >> f
  close(f)
}

# 3  
Old 04-28-2009
Thanks vgersh99 for this reply. Its a real help. Thanks.
But its producing 3 o/p files(with 2 multiples each), could you please point how can I make it produce 3 multiples entries in each file. Thanks.
# 4  
Old 04-28-2009
Quote:
Originally Posted by uwork72
Thanks vgersh99 for this reply. Its a real help. Thanks.
But its producing 3 o/p files(with 2 multiples each), could you please point how can I make it produce 3 multiples entries in each file. Thanks.
yes, it produces 3 files based on your sample input.
As far as multiples go.
I've interpreted your statement:
Quote:
Originally Posted by uwork72
I am trying to split above file based on $2 such that if $2 is rounded to nearest 10's multiple (e.g. 10,20,30 etc), each sub file should contain 3 multiples and so on.
as dividing and multiplying $3 by 30. It looks like it's producing the right results.
Please provide the desired file output(s) based on your sample.
# 5  
Old 04-28-2009
Thanks vgersh99.

The o/p is:

Code:
file1 (here $2 rounded to 10,20,40 are present i.e. first 3 multiples)
-----
H1:12:90
k:12:b
t:18:n
n:22:i
k:42:b
s:48:s
a:41:b

file2 (remaining 50,70)
-----
H1:12:90
k:54:b
c:77:a

# 6  
Old 04-28-2009
try this:

Code:
BEGIN {
  FS=OFS=":"
}
FNR==1 {header=$0;next}
{
  f="file" int($2/50)+1
  if (!a[f]) print header >f
  a[f]++
  print >> f
  close(f)
}

cheers,
Devaraj Takhellambam
# 7  
Old 04-28-2009
Quote:
Originally Posted by devtakh
try this:

Code:
BEGIN {
  FS=OFS=":"
}
FNR==1 {header=$0;next}
{
  f="file" int($2/50)+1
  if (!a[f]) print header >f
  a[f]++
  print >> f
  close(f)
}

cheers,
Devaraj Takhellambam
yeah, works for a given sample with the missing $2 in the 30-39 range. Adding say: 'x:37:y', creates a first file with FOUR ranges (10-19, 20-29, 30-29 and 40-49).
I doubt if that's what the OP wants, but we can ask....
The issue is a little bit more elaborate.......
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

awk do not split if condition is meet

Trying to use awk to format the input based on the filed count being 5. Most lines are fine using the awk below, except the first two lines. I know the reason is the -1 in green and -2 in blue. But can not figure out how to not split on the - if it is followed by a digit then letter. Thank you :).... (1 Reply)
Discussion started by: cmccabe
1 Replies

2. UNIX for Advanced & Expert Users

How to split a large file with the first 100 lines of each condition?

I have a huge file with the following input: Case1 Specific_Info Specific_Info Case1 Specific_Info Specific_Info Case3 Specific_Info Specific_Info Case4 Specific_Info Specific_Info Case1 Specific_Info Specific_Info Case2 Specific_Info Specific_Info Case2 Specific_Info Specific_Info... (2 Replies)
Discussion started by: laurigo
2 Replies

3. Shell Programming and Scripting

How to Split File to 2 depending on condition?

Hi , cat myfile.txt ! 3100.2.0.5 ! 3100.2.22.4 ! 3100.2.30.33 ! 3100.2.4.1 ! ! 3100.2.0.5 ! 3100.2.22.4 ! 3100.2.22.11 ! 3100.2.4.1 ! ! 3100.2.0.5 ! 3100.2.2.50 ! 3100.2.22.11 ! 3100.2.4.1 ! ! 3100.2.0.5 ! 3100.2.22.4 ! 3100.2.30.33 ! 3100.2.4.1 ! ! 3100.2.0.5 ! 3100.2.22.4 !... (6 Replies)
Discussion started by: OTNA
6 Replies

4. Shell Programming and Scripting

how to use split command in unix shell with a condition

Hi all, I have a file which I want to split into several files based on a condition. This files has several records. I want one record per file. Each record ends with a //. So, I want to separate files based on this condition. I want split files to be named with the name across the field ID (for... (2 Replies)
Discussion started by: kaav06
2 Replies

5. Shell Programming and Scripting

Split File by Pattern with File Names in Source File... Awk?

Hi all, I'm pretty new to Shell scripting and I need some help to split a source text file into multiple files. The source has a row with pattern where the file needs to be split, and the pattern row also contains the file name of the destination for that specific piece. Here is an example: ... (2 Replies)
Discussion started by: cul8er
2 Replies

6. Shell Programming and Scripting

redirect stdout echo command in condition A run in condition B

hi, I have some problems in my simple script about the redirect echo stdout command inside a condition. Why is the echo command inside the elif still execute in the else command Here are my simple script After check on the two diff output the echo stdout redirect is present in two diff... (3 Replies)
Discussion started by: jao_madn
3 Replies

7. Shell Programming and Scripting

Split a files into many files when condition

Hi Everyone, file.txt +++ a b c +++ d +++ asdf fefe fff Would like to have the output: file1.txt (22 Replies)
Discussion started by: jimmy_y
22 Replies

8. Shell Programming and Scripting

How to split the String based on condition?

hi , I have a String str="/opt/ibm/lotus/ibw/latest" or ="/opt/lotus/ibw/latest" this value is dynamic..I want to split this string into 2 strings 1. /opt/ibm/lotus(/opt/lotus) this string must ends with "lotus" 2./ibw/latest can any body help me on this? Regards, sankar (2 Replies)
Discussion started by: sankar reddy
2 Replies

9. UNIX for Dummies Questions & Answers

Split a file with no pattern -- Split, Csplit, Awk

I have gone through all the threads in the forum and tested out different things. I am trying to split a 3GB file into multiple files. Some files are even larger than this. For example: split -l 3000000 filename.txt This is very slow and it splits the file with 3 million records in each... (10 Replies)
Discussion started by: madhunk
10 Replies

10. Shell Programming and Scripting

awk script to split a file based on the condition

I have the file with the records like 4234234 US phone 3244234 US cup 2342342 CA phone 8947234 US phone 2389472 CA cup 2348972 US maps 3894234 CA phone I want the records with (US,phone) as record to be in one file, (Us, cup) in another file and (CA,cup) to be in another I mean all... (12 Replies)
Discussion started by: superprogrammer
12 Replies
Login or Register to Ask a Question