Problem with awk syntax


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Problem with awk syntax
# 1  
Old 04-07-2011
Problem with awk syntax

Hi,
Below is the code I am using. I am trying to list only those numbers which has a + symbol in it

Code:
 cat num | awk -F"+" '{if (/^$/)
{
}
else
{if ( $0 ~ egrep "^[0-9+-]+$" )
  {
    if ( $0 ~ grep "+" )
     {print $0}
  }
}}'

I am getting the following error:
Code:
awk: 0602-521 There is a regular expression error.
        ?*+ not preceded by valid expression.

 The input line number is 3.
 The source line number is 7.

Please help.
# 2  
Old 04-07-2011
Code:
awk 'NF>1' FS=+ infile

# 3  
Old 04-07-2011
I am not looking for an alternate way to do this. I would like to know what went wrong with the syntax I am using. Please help.
# 4  
Old 05-17-2011
This is your version, cleaned up so it works, along with test results (test file shown below).
Code:
cat test | awk -F"+" '
{
   if ( $0 ~ /^$/ )
   {
   }
   else
   {
      if ( $0 ~ /^[0-9+-]+$/ )
      {
         if ( $0 ~ /\+/ )
         {print $0}
      }
   }
}'
+1
0+1
1+


Personally, I'd just go with the following, which yields almost the same results, but which could easily altered to yield the exact same results, as what you had (after it was cleaned up), and it is much simpler to read:

# Looking for numbers with a '+' in front of of trailing them, as you might see in a mathematical expression), which matches the output you get in my cleaned up version of your code:
Code:
awk '/\+[0-9]/ || /[0-9]\+/' test
+1
 0+1
 1+
let x=x+1

You did not state whether your input file contained 'statements' such as the above let statement but, if it does, your version will not find them because you are 'anchoring' your regular expression to the beginning and end of the line. Also, your version will not match numbers which contain trailing spaces, which I did not demonstrate in my example but which you can easily test yourself.

Code:
cat test
+1
0+1
1
a
+a
1+
a+
let x=x+1

What went wrong with what your code? The answer is that the '+' is a metacharacter in regular expressions and it must be escaped with a backslash if you want to look for a literal plus sign. (The line just before the print statement in your code.)

According to the Posix regexp standards, + "Matches the preceding element one or more times."

Code:
awk '/+[0-9]/' test
awk: line 1: regular expression compile failed (missing operand)
+[0-9]

fails because there is no preceding operand to match one or more times, just as there is none in your regexp ( "+" ).

and this:
Code:
awk '/[0-9]+/' test
+1
0+1
1
1+

does not fail but does not yield the desired results because, according to the Posix definition, '1' is matched one or more times and we are not looking for a literal '+'.

Other things that didn't go wrong yet because your script failed before it could reach them:

You are attempting to call grep and egrep from within your awk script but you cannot do that without using the awk system call, nor do you need to since awk understands regular expressions.

While it is syntactically correct, I'm not really sure why you are changing the awk field separator to a '+' sign and only applying your logic to 'non-blank' lines. With a properly structured regular expression, as the example above demonstrates, only the lines you are interested in are printed and none of that is required

Last edited by Franklin52; 05-17-2011 at 03:42 AM.. Reason: Please use code tags, thank you
# 5  
Old 05-18-2011
Thank you

Thanks a lot for all your explanations and efforts. As you had rightly pointed out, I need not grep for blank lines having specified the field separator as '+'. Also, I missed to escape the metacharacter. This cleaned up code works fine:
Code:
cat num | awk -F"+" '
{if ( $0 ~ /^[0-9+-]+$/ )
      {
         if ( $0 ~ /\+/ )
         {print $0}
      }
   }'

# 6  
Old 05-18-2011
Quote:
Originally Posted by sudvishw
Thanks a lot for all your explanations and efforts. As you had rightly pointed out, I need not grep for blank lines having specified the field separator as '+'. Also, I missed to escape the metacharacter. This cleaned up code works fine:
Code:
cat num | awk -F"+" '
{if ( $0 ~ /^[0-9+-]+$/ )
      {
         if ( $0 ~ /\+/ )
         {print $0}
      }
   }'

This is Useless Use of Cat.

Code:
awk '{ commands .. }' num

# 7  
Old 05-19-2011
According to the useless use of cat web page that you refer to:

"Briefly, here's the collected wisdom on using cat:
The purpose of cat is to concatenate (or "catenate") files. If it's only one file, concatenating it with nothing at all is a waste of time, and costs you a process."
By extension of the logic in that argument, ANY use of cat is a useless use of cat since you can concatenate files (the purpose of cat, per the above quote) using only awk (per the below example) without costing yourself a process. In fact, this is true of most Unix commands that you would normally pipe the output of "cat file" to so perhaps they should just remove the cat command from Unix entirely for being redundant and, therefore, unnecessary?

awk '{print}' file1 file2 file3
1 line
2 lines
3 lines

awk '{print}' file1
1 line

awk '{print}' file2
2 lines

awk '{print}' file3
3 lines
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk problem with syntax

awk -v sw="lemons|dogs" 'NR>100 && NR<200 BEGIN { c=split(sw,a,""); } { for (w in a) { if ($0 ~ a) d]++; } } END { for (i in a) { o=o (a"="(d]?d]:0)","); } sub(",*$","",o); print o; }' /home/jahitt/data.txt what am i doing wrong with the above code? im pretty sure the issue is in the... (6 Replies)
Discussion started by: SkySmart
6 Replies

2. Shell Programming and Scripting

awk syntax problem

Hi, I am using this awk command in my shell script : find . -name "*" -ctime -6 | xargs cat | grep -E -v ^fileName\|^\(\) | awk -v DATE="${CURR_DATE}" -v DATE_LOG=$DATE_SYS 'BEGIN {FS=";";OFS=";";CONVFMT="%.9g";OFMT="%.9g"}... (4 Replies)
Discussion started by: abhi1988sri
4 Replies

3. Shell Programming and Scripting

Problem with if-else syntax

I'm calling the following if-else from nawk. But I keep getting an error at the "else". I've tried putting more brackets and ; but still I get complaints about the "else". Any ideas ? Thanks, wbrunc BEGIN { FS = "," ; OFS = "," } { if ( $8 ~ /A/ && $9 == B ) $1="4/29/2013" ; $2="J.Doe"... (2 Replies)
Discussion started by: wbrunc
2 Replies

4. Shell Programming and Scripting

Help with awk syntax error problem asking

Input file: 703 1192 720 1162 316 380 1810 439 1969 874 Desired output file: 3 3 awk code that I tried: (1 Reply)
Discussion started by: perl_beginner
1 Replies

5. Shell Programming and Scripting

Syntax Problem with awk

Hello, I have perl script,which take some part of data in the file. the below command works fine in normal cmd prompt. `awk '/CDI/ && // && !/Result for/ {print $3 $5 > "final.txt"}' datalist.txt`; `nawk -F"" '{print $2}' finalcdi.txt`; But not working. Please use code tags, thanks. (5 Replies)
Discussion started by: rasingraj
5 Replies

6. Shell Programming and Scripting

Problem with syntax using awk

Hi Guys, When below code is executed in script, I get desired output in output file. awk 'NR >= $start_line && NR <= 3' master_scriptlist.txt > $driver1/scriptlist.txtBut when i replace 3 with a variable end_line=3, I do not get ouput. See code below. Is there any problem with syntax awk... (6 Replies)
Discussion started by: ajincoep
6 Replies

7. Programming

Syntax Problem in Query

Hey guys, i am having a problem in my query statement. I am using Mysql in Netbeans and c++. What i am trying to do is for the user to enter a certain value and then the program will store the value into the database... string NewMovie ; Cout <<" Enter your new movie : " << endl ; ... (1 Reply)
Discussion started by: gregarion
1 Replies

8. Shell Programming and Scripting

remote awk syntax problem

Hi there If i run this command on my Linux box directly, i get the desired result # ipmitool fru | gawk '!NF{f=0}/mb.net0.fru/{f=1}/Product Serial/&&f{print $NF}' 00:AA:4F:A6:A6:C4 however, if i try to run it from a remote server (using SSH) and populating a variable with the result,... (5 Replies)
Discussion started by: hcclnoodles
5 Replies

9. Shell Programming and Scripting

syntax problem

Dear friends, I am writing shell script in csh . i want to make arthimatic operation in csh. i wrote sysntax like this. set val = 230 set tmp = `0.1 * $val + 300` echo $tmp but it is not working . anyone please give me syntax. (3 Replies)
Discussion started by: rajan_ka1
3 Replies

10. Shell Programming and Scripting

syntax problem

dear friends, I have a large size file containg two fields data like this *** **** 122 222 ***** ***** ***** ***** 232 233 i have file like this. i want to remove blank lines from file . i think awk is servive this problem i wrote a awk command but the error is... (3 Replies)
Discussion started by: rajan_ka1
3 Replies
Login or Register to Ask a Question