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
# 15  
Old 07-24-2009
Code:
c1    5    120    +    5,10,5,10,20    0,25,40,75,95

Code:
c1    5    10    5    120    +    5,10,5,10,20    0,25,40,75,95
    30    40                    
    45    60                    
    80    90

The third line should be:

Code:
45    50

and not

Code:
45    60

Or I'm missing something?

As far as the second task is concerned, you said:

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

The first value of the 7th column (actually it's the fifth column in your original input) is 2, not 25? 25 is the second column in the original input ...

Could you clarify Smilie
# 16  
Old 07-24-2009
First of all I have to say sorry for errors in posting. Please excuse me for this time. You are right about the errors.

I'm including new inputs

INPUT1

Code:
c1	5	120	+	5,10,5,10,20	0,25,40,75,95
c1	5	120	-	5,10,5,10,20	0,25,40,75,95

OUTPUT

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	120	100	5	120	-	5,10,5,10,20	0,25,40,75,95
	90	80					
	45	60					
	40	30				
	10	5

All the original inputfiles are exactly looks like input1.
The Amazing Awk script that u have developed is for OUTPUT.

My request is to modify the script that suitable to OUTPUT.

Last edited by repinementer; 07-24-2009 at 06:02 AM..
# 17  
Old 07-24-2009
I understand how you calculate the lower bound of the range.
I don't understand how you calculate the upper bound.
Could you try to elaborate further?

first record

Code:
c1    5    120    +    5,10,5,10,20    0,25,40,75,95

relevant columns

Code:
+    5,10,5,10,20    0,25,40,75,95

So, for the lower bound - the new second column - we have:

Code:
5 + 0 = 5
5 + 25 = 30
5 + 40 = 45
and so on...

Could you explain how the new third column (the upper bound) should be calculated? How you get the following numbers:

Code:
10
40
60
90
120

# 18  
Old 07-24-2009
Well the low bound values adds with 5,10,15,10,20 and produce upperbound


Code:
+    5,10,15,10,20    0,25,40,75,95

5 + 0 = 5
5 + 25 = 30
5 + 40 = 45
and so on...

5 + 5 = 10
30 +10 = 40
45 + 15 = 60
80 + 10 = 90
100 + 20 = 120


Last edited by repinementer; 07-24-2009 at 06:42 AM..
# 19  
Old 07-24-2009
OK,
so, as I already mentioned, your example output was wrong.

Your original input file contains:

Code:
5,10,5,10,20

and not:

Code:
5,10,15,10,20

# 20  
Old 07-24-2009
YAAAA. Sorry DA
Thst why I mentioned in Bold :-(

---------- Post updated at 02:07 AM ---------- Previous update was at 02:05 AM ----------

The book you have suggested is really Awesome.
Thanx
# 21  
Old 07-24-2009
OK,
given the following input:

Code:
zsh-4.3.10[t]% cat infile
c1      5       120     +       5,10,15,10,20   0,25,40,75,95
c1      5       120     -       5,10,15,10,20   0,25,40,75,95

This code:

Code:
awk '{
  fifth = split($5, _fifth, ","); sixth = split($6, _sixth, ",")
  counter = 0; key = $1; flag = $4; sub(/[^ \t*]*/, "")
  dummy = sprintf("%*s", length(key),x)
  for (i=1; i<=sixth; i++) {
    second_third = _fifth[1] + _sixth[i] FS _fifth[i] + _fifth[1] + _sixth[i]
    third_second = _fifth[i] + _fifth[1] + _sixth[i] FS _fifth[1] + _sixth[i] 
    if (flag == "+") 
      rec = rec ? rec RS dummy OFS second_third : key OFS second_third OFS $0
    else  
      rec_rev = rec_rev ? \
        (++counter == sixth - 1 ? key OFS third_second OFS $0 : dummy OFS third_second ) RS rec_rev : \
        dummy OFS third_second
    }
  print (flag == "+" ? rec : rec_rev)    
 }' OFS='\t' ORS='\n\n' infile

... produces the following output:

Code:
zsh-4.3.10[t]% nawk '{   
  fifth = split($5, _fifth, ","); sixth = split($6, _sixth, ",")
  counter = 0; key = $1; flag = $4; sub(/[^ \t*]*/, "")
  dummy = sprintf("%*s", length(key),x)
  for (i=1; i<=sixth; i++) {
    second_third = _fifth[1] + _sixth[i] FS _fifth[i] + _fifth[1] + _sixth[i]
third_second = _fifth[i] + _fifth[1] + _sixth[i] FS _fifth[1] + _sixth[i]
if (flag == "+")
  rec = rec ? rec RS dummy OFS second_third : key OFS second_third OFS $0
else
  rec_rev = rec_rev ? \
    (++counter == sixth - 1 ? key OFS third_second OFS $0 : dummy OFS third_second ) RS rec_rev : \
dummy OFS third_second
    }
  print (flag == "+" ? rec : rec_rev)
 }' OFS='\t' ORS='\n\n' infile
c1      5 10            5       120     +       5,10,15,10,20   0,25,40,75,95
        30 40
        45 60
        80 90
        100 120

c1      120 100         5       120     -       5,10,15,10,20   0,25,40,75,95
        90 80
        60 45
        40 30
        10 5

Merging the two scripts is left as an exercise Smilie
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