match range of different numbers by AWK


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting match range of different numbers by AWK
# 8  
Old 07-23-2009
eXAMPLEFILE

I've attched the excel with input and desired output and logic behind that.
Hope this time its clearSmilie
# 9  
Old 07-23-2009
OK,
I think it's clear now. The format of your input files is like the one you posted in the first post or it's like the one in the xls file?
# 10  
Old 07-23-2009
MySQL Hey Glad you understand

The format in XLS file is the correct one.

Is it possible to up grade the script based on XLSfile values and format.

Thank you for co-operation and patience in understanding my question
and get backing to me

Really appreciated
# 11  
Old 07-23-2009
You swapped the input filenames in your xls, so this time the order is input2 input1. Try this code:


Code:
awk 'BEGIN {
  def["ascoutlower"]    = "ARANGE"   
  def["ascoutupper"]    = "BRANGE"
  def["descoutlower"]   = "CRANGE"
  def["descoutupper"]   = "DRANGE"
  def["ascinnotexact"]  = "ERANGE"
  def["descinnotexact"] = "FRANGE"
  def["ascinexact"]     = "GRANGE"
  def["descinexact"]    = "HRANGE"
  }
NR == FNR && NF {
  NF > 2 && k = $1
  in2[k] = in2[k] ? in2[k] RS $1 FS $2 : $2 FS $3
  next
  }
$1 in in2 {
  n = split(in2[$1], tmp, RS) 
  split(tmp[1], Tmp); min = Tmp[1]
  m = split(tmp[n], Tmp); max = Tmp[m]
  # asc - desc
  Def = $2 > $3 ? "desc" : "asc"
  # inrange - outofrange
  if (Def == "asc")
    Def = Def ($2 >= min && $3 <= max ? "in" : "out") 
  else
    Def = Def ($3 >= min && $2 <= max ? "in" : "out")
  # lower - upper
  if ((Def ~ /ascout/ ? $3 : $2) <= min) {
    Def = Def "lower"
    print $0 "\t\t" def[Def]
    next
    }
  if ((Def ~ /ascout/ ? $3 : $2) >= max) {
    Def = Def "upper"
    print $0 "\t\t" def[Def]
    next
    }    
  # exact - not exact
  for (i=1; i<=n; i++) {
    split(tmp[i], range)
    if (Def ~ /asc/) { k1 = $2; k2 = $3 }      
    else { k1 = $3; k2 = $2 }
    if (k1 >= range[1] && k2 <= range[2]) {
      Def = Def "exact"
      print $0 "\t\t" def[Def]
      next
      }
    }
      Def = Def "notexact"
    print $0 "\t\t" def[Def]
    next    
}1' input2 input1

# 12  
Old 07-23-2009
AmazingSmilie
Really I didn't believe u just did with awk. Thanx alotSmilie
could you please suggest me any thing. I'm really interested in learning AWKSmilie
OUTPUT I gOT like this
Code:
c1	1	4	1	4	+	1	3	0		ARANGE
c1	120	140	120	140	+	1	20	0		BRANGE
c1	4	1	4	1	-	1	3	0		CRANGE
c1	140	120	140	120	-	1	20	0		DRANGE
c1	65	69	65	100	+	2	4,30	0,5		ERANGE
	70	100						
c1	71	65	71	40	-	2	4,10	0,21		FRANGE
	44	40						
c1	30	33	33	83	+	3	3.20,20	0,7,30GRANGE
	37	57						
	63	83						
c1	85	81	85	25	-	2	5,4	0,56		HRANGE
	30	25						
c2	4	1	4	1	-	1	3	0
c2	140	120	140	120	-	1	20	0
c3	65	69	65	100	+	2	4,30	0,5
	70	100						
c2	71	65	71	40	-	2	4,10	0,21
	44	40						
c9	140	120	140	120	-	1	20	0

Is it possible it modify like this
Code:
c1	1	4	1	4	+	1	3	0		ARANGE
c1	120	140	120	140	+	1	20	0		BRANGE
c1	4	1	4	1	-	1	3	0		CRANGE
c1	140	120	140	120	-	1	20	0		DRANGE
c1	65	69	65	100	+	2	4,30	0,5		ERANGE					
c1	71	65	71	40	-	2	4,10	0,21		FRANGE						
c1	30	33	33	83	+	3	3.20,20 0,7,30    GRANGE						
c1	85	81	85	25	-	2	5,4	0,56		HRANGE					
c2	4	1	4	1	-	1	3	0              UNKNOWN
c2	140	120	140	120	-	1	20	0              UNKNOWN
c3	65	69	65	100	+	2	4,30	0,5	        UNKNOWN				
c2	71	65	71	40	-	2	4,10	0,21	        UNKNOWN					
c9	140	120	140	120	-	1	20	0              UNKNOWN

# 13  
Old 07-23-2009
Sure:

Code:
awk 'BEGIN {
  def["ascoutlower"]    = "ARANGE"   
  def["ascoutupper"]    = "BRANGE"
  def["descoutlower"]   = "CRANGE"
  def["descoutupper"]   = "DRANGE"
  def["ascinnotexact"]  = "ERANGE"
  def["descinnotexact"] = "FRANGE"
  def["ascinexact"]     = "GRANGE"
  def["descinexact"]    = "HRANGE"
  }
NR == FNR && NF {
  NF > 2 && k = $1
  in2[k] = in2[k] ? in2[k] RS $1 FS $2 : $2 FS $3
  next
  }
$1 in in2 {
  n = split(in2[$1], tmp, RS) 
  split(tmp[1], Tmp); min = Tmp[1]
  m = split(tmp[n], Tmp); max = Tmp[m]
  # asc - desc
  Def = $2 > $3 ? "desc" : "asc"
  # inrange - outofrange
  if (Def == "asc")
    Def = Def ($2 >= min && $3 <= max ? "in" : "out") 
  else
    Def = Def ($3 >= min && $2 <= max ? "in" : "out")
  # lower - upper
  if ((Def ~ /ascout/ ? $3 : $2) <= min) {
    Def = Def "lower"
    print $0 "\t\t" def[Def]
    next
    }
  if ((Def ~ /ascout/ ? $3 : $2) >= max) {
    Def = Def "upper"
    print $0 "\t\t" def[Def]
    next
    }    
  # exact - not exact
  for (i=1; i<=n; i++) {
    split(tmp[i], range)
    if (Def ~ /asc/) { k1 = $2; k2 = $3 }      
    else { k1 = $3; k2 = $2 }
    if (k1 >= range[1] && k2 <= range[2]) {
      Def = Def "exact"
      print $0 "\t\t" def[Def]
      next
      }
    }
      Def = Def "notexact"
    print $0 "\t\t" def[Def]
    next    
}
!/^[ \t]/ { print $0 "\t\tUNKNOWN" }' input2 input1

Gawk: Effective AWK Programming by Arnold Robbins is free.
# 14  
Old 07-23-2009
Note:Only consider if you have time. Thanq u

Actually before posting this question I made a small script that do the following job that made the input files for you script from the main inputfiles. (posted few 2 examples down)
I have 3 scripts to do this job. If you have time could you incorporate anything in your script that do this type of job.

If you want I ill post you the scripts I have used (not so professional but do the job)

INPUT
Code:
c1	5	120	+	5,10,5,10,20	0,25,40,75,95
c1	25	85	-	2	5,4	0,56

OUPUT (THE ONES YOU ARE USED AS INPUT2 AND INPUT2)

Code:
c1	5	10	5	120	+	5,10,5,10,20	0,25,40,75,95
	30	40					
	45	60					
	80	90					
	100	120	
c1	85	81	85	25	-	2	5,4	0,56
	30	25

As you can see I'm doing 2 tasks to get the new columns in output i.e, 2nd and 3rd columns.
1task. if the 6th column of inputs contains " + "then 1st value of 7th column adds with 1st value of 8th column and produce new value in second column of output and then 1st value of 7th column (same one) adds with 2nd value of 8th column and produce new value in third column of output and so on. It looks like this
LOGIC
Code:
5,10,5,10,20	0,25,40,75,95
5+0=5  5+5=10        
5+25=30 30+10=40 and so on

2task.if the 6th column of inputs contains "-" (Minus symbol) then 1st value of 7th column adds with 1st value of 8th column and produce new value in second column of output and then 1st value of 7th column (same one) adds with 2nd value of 8th column and produce new value in third column of output and so on.Finally every thing will be placed in reverse order. It looks like this

Code:
25	85	-	2	5,4	0,56
25+0=25  25+5=30  
25+56=81 81+4=85  

and they reversed and ascended from high to low because of -
	81	85	
	30	25



---------- Post updated at 06:39 AM ---------- Previous update was at 06:38 AM ----------

I will read the and practice the book you mentioned So helpful.

Last edited by repinementer; 07-23-2009 at 11:46 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk to print text in field if match and range is met

In the awk below I am trying to match the value in $4 of file1 with the split value from $4 in file2. I store the value of $4 in file1 in A and the split value (using the _ for the split) in array. I then strore the value in $2 as min, the value in $3 as max, and the value in $1 as chr. If A is... (6 Replies)
Discussion started by: cmccabe
6 Replies

2. Shell Programming and Scripting

Get range out using sed or awk, only if given pattern match

Input: START OS:: UNIX Release: xxx Version: xxx END START OS:: LINUX Release: xxx Version: xxx END START OS:: Windows Release: xxx Version: xxx ENDHere i am trying to get all the information between START and END, only if i could match OS Type. I can get all the data between the... (3 Replies)
Discussion started by: Dharmaraja
3 Replies

3. Shell Programming and Scripting

Match on a range of numbers

Hi, I'm trying to match a filename that could be called anything from vout001 to vout252 and was trying to do a small test but I'm not getting the result I thought I would.. Can some one tell me what I'm doing wrong? *****@********>echo $mynumber ... (4 Replies)
Discussion started by: Jazmania
4 Replies

4. Shell Programming and Scripting

awk : match only the pattern string , not letters or numbers after that.

Hi Experts, I am finding difficulty to get exact match: file OPERATING_SYSTEM=HP-UX LOOPBACK_ADDRESS=127.0.0.1 INTERFACE_NAME="lan3" IP_ADDRESS="10.53.52.241" SUBNET_MASK="255.255.255.192" BROADCAST_ADDRESS="" INTERFACE_STATE="" DHCP_ENABLE=0 INTERFACE_NAME="lan3:1"... (6 Replies)
Discussion started by: rveri
6 Replies

5. Shell Programming and Scripting

Complex match of numbers between 2 files awk script

Hello to all, I hope some awk guru could help me. I have 2 input files: File1: Is the complete database File2: Contains some numbers which I want to compare File1: "NUMBERKEY","SERVICENAME","PARAMETERNAME","PARAMETERVALUE","ALTERNATENUMBERKEY"... (9 Replies)
Discussion started by: Ophiuchus
9 Replies

6. Shell Programming and Scripting

Awk numeric range match only one digit?

Hello, I have a text file with lines that look like this: 1974 12 27 -0.72743 -1.0169 2 1.25029 1974 12 28 -0.4958 -0.72926 2 0.881839 1974 12 29 -0.26331 -0.53426 2 0.595623 1974 12 30 7.71432E-02 -0.71887 3 0.723001 1974 12 31 0.187789 -1.07114 3 1.08748 1975 1 1 0.349933 -1.02217... (2 Replies)
Discussion started by: meridionaljet
2 Replies

7. Shell Programming and Scripting

Range of numbers in HEX using AWK

Hi , How do i found out all the number in a range ( HEX) for example Input is 15CF:15D2 Output needed 15CF 15D0 15D1 15D2 Thanks (2 Replies)
Discussion started by: greycells
2 Replies

8. Shell Programming and Scripting

awk to match a numeric range specified by two columns

Hi Everyone, Here's a snippet of my data: File 1 = testRef2: A1BG - 13208 13284 AAA1 - 34758475 34873943 AAAS - 53701240 53715412File 2 = 42MLN.3.bedS2: 13208 13208 13360 13363 13484 13518 13518My awk script: awk 'NR == FNR{a=$1;next} {$1>=a}{$1<=a}{print... (5 Replies)
Discussion started by: heecha
5 Replies

9. Shell Programming and Scripting

Match real numbers in AWK

I am looking for a better way to match real numbers within a specified tolerance range. My current code is as follows: if ($1 !~ /^CASE/) for(i=1;i in G;i++) if (G >= $5-1 && G <= $5+1) { print $1,$4,$5,J,G } else { print $1,"NO MATCH" } where $5 and G are... (3 Replies)
Discussion started by: cold_Que
3 Replies

10. Shell Programming and Scripting

match numbers (awk)

i would like to enter (user input) a bunch of numbers seperated by space: 10 15 20 25 and use awk to print out any lines in a file that have matching numbers so output is: 22 44 66 55 (10) 77 (20) (numbers 10 and 20 matched for example) is this possible in awk . im using gawk for... (5 Replies)
Discussion started by: tanku
5 Replies
Login or Register to Ask a Question