awk problem with syntax


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting awk problem with syntax
# 1  
Old 10-29-2013
awk problem with syntax

Code:
awk -v sw="lemons|dogs" 'NR>100 && NR<200 BEGIN { c=split(sw,a,"[|]"); } { for (w in a) { if ($0 ~ a[w]) d[a[w]]++; } }
END { for (i in a) { o=o (a[i]"="(d[a[i]]?d[a[i]]: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 bolded. how can this be fixed?
# 2  
Old 10-29-2013
Quote:
Originally Posted by SkySmart
Code:
awk -v sw="lemons|dogs" 'NR>100 && NR<200 BEGIN { c=split(sw,a,"[|]"); } { for (w in a) { if ($0 ~ a[w]) d[a[w]]++; } }
END { for (i in a) { o=o (a[i]"="(d[a[i]]?d[a[i]]: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 bolded. how can this be fixed?
'NR>100 && NR<200 BEGIN { c=split(sw,a,"[|]"); } to BEGIN { c=split(sw,a,"[|]"); }

NR>100 && NR<200{ for (w in a) { if ($0 ~ a[w]) d[a[w]]++; } }

{ o=o ;(a[i]"="(d[a[i]]?d[a[i]]:0)","); }what is o ? where you defined ?
sub(",*$","",o); print o;

if you want line use $0

what is the purpose of code ? if you show input and expected output it will be helpful for us.

Last edited by Akshay Hegde; 10-29-2013 at 02:06 PM..
This User Gave Thanks to Akshay Hegde For This Post:
# 3  
Old 10-29-2013
BEGIN and END special rules can be intermixed with other rules, but you cannot add another rule with these. So below is wrong:
Code:
'NR>100 && NR<200 BEGIN ..

Correction:
Code:
awk -v sw="lemons|dogs" '
        NR > 100 && NR < 200 {
                for (w in a)
                {
                        if ($0 ~ a[w])
                                d[a[w]]++
                }
        }
        BEGIN {
                c = split(sw,a,"[|]")
        }
        END {
                for (i in a)
                {
                        o = o (a[i]"="(d[a[i]]?d[a[i]]:0)",")
                }
                sub(",*$","",o)
                print o
        }
' /home/jahitt/data.txt

This User Gave Thanks to Yoda For This Post:
# 4  
Old 10-29-2013
Yoda's fix will give you a working program that counts the number of lines from line number 101 through line number 199 that contain "lemons" and that contain "dogs" and print them at the end. But, you didn't tell us what this script is supposed to do.

Another way to read what you were trying to do would be print lines 101 through 199 from your input file and at the end print the number of lines in the entire file that contaied "dogs" and the number of lines in the entire file that contained "lemons". If that was your intent, the one character change marked in red below to your original script should work:
Code:
awk -v sw="lemons|dogs" 'NR>100 && NR<200;BEGIN { c=split(sw,a,"[|]"); } { for (w in a) { if ($0 ~ a[w]) d[a[w]]++; } }
END { for (i in a) { o=o (a[i]"="(d[a[i]]?d[a[i]]:0)","); }
  sub(",*$","",o); print o;
}' /home/jahitt/data.txt

Although I prefer more readable code like:
Code:
awk -v sw="lemons|dogs" '
NR>100 && NR<200
BEGIN { c=split(sw,a,"[|]")
}
{       for (w in a) {
                if ($0 ~ a[w])
                        d[a[w]]++
        }
}
END {   for (i in a) {
                o=o (a[i]"="(d[a[i]]?d[a[i]]:0)",")
        }
        sub(",*$","",o)
        print o
}' /home/jahitt/data.txt

If your input file contained:
Code:
lemons and dogs
lemons only
cats and dogs
dogs only
cats only
lemons and cats and dogs

the above scripts produce:
Code:
dogs=4,lemons=3

but the output order is unspecified.

Last edited by Don Cragun; 10-29-2013 at 02:28 PM.. Reason: Fix typo; both scripts produce the same data.
This User Gave Thanks to Don Cragun For This Post:
# 5  
Old 10-29-2013
Quote:
Originally Posted by Don Cragun
Yoda's fix will give you a working program that counts the number of lines from line number 101 through line number 199 that contain "lemons" and that contain "dogs" and print them at the end. But, you didn't tell us what this script is supposed to do.

Another way to read what you were trying to do would be print lines 101 through 199 from your input file and at the end print the number of lines in the entire file that contaied "dogs" and the number of lines in the entire file that contained "lemons". If that was your intent, the one character change marked in red below to your original script should work:
Code:
awk -v sw="lemons|dogs" 'NR>100 && NR<200;BEGIN { c=split(sw,a,"[|]"); } { for (w in a) { if ($0 ~ a[w]) d[a[w]]++; } }
END { for (i in a) { o=o (a[i]"="(d[a[i]]?d[a[i]]:0)","); }
  sub(",*$","",o); print o;
}' /home/jahitt/data.txt

Although I prefer more readable code like:
Code:
awk -v sw="lemons|dogs" '
NR>100 && NR<200
BEGIN { c=split(sw,a,"[|]")
}
{       for (w in a) {
                if ($0 ~ a[w])
                        d[a[w]]++
        }
}
END {   for (i in a) {
                o=o (a[i]"="(d[a[i]]?d[a[i]]:0)",")
        }
        sub(",*$","",o)
        print o
}' /home/jahitt/data.txt

If your input file contained:
Code:
lemons and dogs
lemons only
cats and dogs
dogs only
cats only
lemons and cats and dogs

the above scripts produce:
Code:
dogs=4,lemons=3

but the output order is unspecified.
your assumption is right on target! thank you.

i just thought of a different possibility, what happens if i want to exclude (for the string 'lemons') all lines that contain the word 'only'?

so in your output, if the lemon lines containing 'only' are excluded, then, the count should be:

Code:
dogs=4,lemons=2

# 6  
Old 10-29-2013
Quote:
Originally Posted by SkySmart
your assumption is right on target! thank you.

i just thought of a different possibility, what happens if i want to exclude (for the string 'lemons') all lines that contain the word 'only'?

so in your output, if the lemon lines containing 'only' are excluded, then, the count should be:

Code:
dogs=4,lemons=2

The trivial way is to special case "lemons" and "only" by changing the line:
Code:
                if ($0 ~ a[w])

to:
Code:
                if ($0 ~ a[w] && (a[w] != "lemons" || $0 !~ "only"))

But, if you decide to change basic logic in your original requirements, you should consider whether you need to redesign everything so that each counted pattern has a list of zero or more exclusions that should be considered. (And, I'm not going to try to guess at your new requirements and propose a new syntax for your sw variable to make that happen.)

Quick prototyping works well sometimes. But, sitting down and clearly defining your requirements before you start programming will usually give you a much more coherent, maintainable piece of software that works better and does what you want.
# 7  
Old 10-29-2013
In perl:

Code:
#!/usr/bin/perl -w

my (@lem_lines,@dogs_lines);

while(<>){
if (($. > 100) && ($. < 200)) {
push @lem_lines,$_ if /^lemons (?!only)/;
push @dogs_lines,$_ if /dogs/;
}
}
my $lem=scalar @lem_lines;
my $dogs=scalar @dogs_lines;
print "Number of lemons excluding ( lemons only ) in lines from 101 to 199 is : $lem\n";
print "count of dogs in lines from 101 to 199 is: $dogs\n";

Run as
Code:
perl try.pl input_file

I tried for the given input by Don Cragun and works well.
Thanks Don C for your explanation about the problem.

Ofcourse , regular expression has to be updated to look for dogs or lemons only etc if skysmart is looking for specific locations for example .
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

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

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

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

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

5. Shell Programming and Scripting

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 cat num | awk -F"+" '{if (/^$/) { } else {if ( $0 ~ egrep "^+$" ) { if ( $0 ~ grep "+" ) {print $0} } }}' I am getting the following error: awk: 0602-521 There is a... (7 Replies)
Discussion started by: sudvishw
7 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