Awk numeric range match only one digit?


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
# 1  
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  
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  
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 for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #185
Difficulty: Medium
Moderating questions and answers at UNIX.com requires superior UNIX shell scripting abilities.
True or False?

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

awk to search field2 in file2 using range of fields file1 and using match to another field in file1

I am trying to use awk to find all the $2 values in file2 which is ~30MB and tab-delimited, that are between $2 and $3 in file1 which is ~2GB and tab-delimited. I have just found out that I need to use $1 and $2 and $3 from file1 and $1 and $2of file2 must match $1 of file1 and be in the range... (6 Replies)
Discussion started by: cmccabe
6 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

Featured Tech Videos