Awk numeric range match only one digit?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Awk numeric range match only one digit?
# 1  
Old 11-01-2011
Awk numeric range match only one digit?

Hello,

I have a text file with lines that look like this:

Code:
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 3 1.08041 
1975 1 2 0.401935 -1.21842 3 1.28301 
1975 1 3 0.545325 -1.0697 3 1.20068 
1975 1 4 0.240114 -1.05894 3 1.08583

I want awk to search the 2nd field (which represents months) and spit out lines where that field's numeric value falls within a certain range. My code for this is:

Code:
echo "Please pick a numerical range (e.g. 6-9 for Jun-Sep)"
read months
awk '$2 ~ /['$months']/ {print $0}' file1.txt > file2.txt

This works great for, say, the range 6-9, but the problem is that for a month system, the numbers 1 and 2 will be matched in the numbers 10, 11, and 12, so a search for "1-3" (January-March) will return October, November, and December values that I don't want. I have tried forcing only a 1-digit match using:

Code:
awk '$2 ~ /['$months']{1}/ {print $0}' mjo-tmp0.txt > mjo-tmp1.txt

...but that doesn't work(it returns nothing), and even if it did, it would eliminate searches for double-digit months like "10-12". Is there a way for me to get awk to search only for exact matches within the numerical range? Any help would be appreciated.
# 2  
Old 11-01-2011
Try comparing $2 as a number, not a regex.

Code:
awk 'BEGIN { MIN=1; MAX=9; }
($2 >= MIN) && ($2 <= MAX)'

The { print $0 } is redundant if all you want is print $0. That's what happens by default given no code block.

---------- Post updated at 01:38 PM ---------- Previous update was at 01:36 PM ----------

Also, if you have -v, that's a safer and simpler way to get variables into awk:

Code:
awk -v MIN=1 -v MAX=9 '($2 >= MIN)&&($2 <= MAX)'

# 3  
Old 11-01-2011
Quote:
Originally Posted by Corona688
Try comparing $2 as a number, not a regex.

Code:
awk 'BEGIN { MIN=1; MAX=9; }
($2 >= MIN) && ($2 <= MAX)'

The { print $0 } is redundant if all you want is print $0. That's what happens by default given no code block.

---------- Post updated at 01:38 PM ---------- Previous update was at 01:36 PM ----------

Also, if you have -v, that's a safer and simpler way to get variables into awk:

Code:
awk -v MIN=1 -v MAX=9 '($2 >= MIN)&&($2 <= MAX)'

Thank you very much. This is the framework I needed.
This User Gave Thanks to meridionaljet For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

I need to find in a file a list of number where last two digit end in a range

I all I am tryng to find a way to sort a list of number in a file by the value of last two digit. i have a list like this 313202320388 333202171199 373202164587 393202143736 323202132208 353201918107 343201887399 363201810249 333201805043 353201791691 (7 Replies)
Discussion started by: rattoeur
7 Replies

2. 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

3. 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

4. Shell Programming and Scripting

awk to update specific value in file with match and add +1 to specific digit

I am trying to use awk to match the NM_ in file with $1 of id which is tab-delimited. The NM_ will always be in the line of file that starts with > and be after the second _. When there is a match between each NM_ and id, then the value of $2 in id is substituted or used to update the NM_. Each NM_... (3 Replies)
Discussion started by: cmccabe
3 Replies

5. Shell Programming and Scripting

Zipping files by numeric name range

Hi there, Not being too up on bash shell programming at this point, could anyone throw me a bone about how to zip up a set of numerically-named files by range? For example, in a folder that contains files 1.pdf through 132000.pdf, I'd like to zip up just those files that are 50000.pdf and... (6 Replies)
Discussion started by: enwood
6 Replies

6. Shell Programming and Scripting

awk length of digit and print at most right digit

Have columns with digits and strings like: input.txt 3840 3841 3842 Dav Thun Tax Cahn 146; Dav. 3855 3853 3861 3862 Dav Thun Tax 2780 Karl VI., 3873 3872 3872 Dav Thun Tax 3894 3893 3897 3899 Dav Thun Tax 403; Thun 282. 3958 3959 3960 Dav Thun Tax 3972 3972 3972 3975 Dav Thun Tax... (8 Replies)
Discussion started by: sdf
8 Replies

7. Programming

Perl : Numeric Range Pattern Matching

hi Experts just wondering if you can help me check a number between a specific range if i have an ip address , how can i say the valid number for ip between 1 to 254 something like this if ($ip ) =~ /.../ { } what the pattern i need to type thanks (3 Replies)
Discussion started by: doubando
3 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 range of different numbers by AWK

if the column1 and 2 in both files has same key (for example "a" and "a1") compare each first key value(a1 of a) of input2 (for example 1-4 or 65-69 not 70-100 or 44-40 etc) with all the values in input1. if the range of first key value in input2 is outof range in input1 values named it as out... (54 Replies)
Discussion started by: repinementer
54 Replies

10. Shell Programming and Scripting

numeric range comparisons

I have two files.And a sort of matrix analysis. Both files have a string followed by two numbers: File 1: A 2 7 B 3 11 C 5 10 ...... File 2: X 1 10 Y 3 5 Z 5 9 What I'd like to do is for each set of numbers in the second file indicate if the first or second number (or both) in... (7 Replies)
Discussion started by: dcfargo
7 Replies
Login or Register to Ask a Question