ProgrammingThis forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.
Notices
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
I'm learning awk and wrote a simple test program. The desired operation is to read a file of words and output only those which...
- are five characters long
- have the same letter in position 2 and 5.
A sample input file...
-F '' -- set field separator to empty string, in which case awk treats each character as a field. NF -- number of fields; in this case -- length of words. $2, $5 -- second and 5th character in the string.
EDIT:
1) Note that if there are no action "{...}" after a pattern (or logical expression) then, by default, awk assumes '{print $0;}'
2) from info gawk:
Quote:
* Null strings are removed when they occur as part of a non-null
command-line argument, while explicit non-null objects are kept.
For example, to specify that the field separator `FS' should be
set to the null string, use:
awk -F "" 'PROGRAM' FILES # correct
Don't use this:
awk -F"" 'PROGRAM' FILES # wrong!
In the second case, `awk' will attempt to use the text of the
program as the value of `FS', and the first file name as the text
of the program! This results in syntax errors at best, and
confusing behavior at worst.
-F '' -- set field separator to empty string, in which case awk treats each character as a field. NF -- number of fields; in this case -- length of words. $2, $5 -- second and 5th character in the string.
Thank you, firstfire, for this remarkably concise solution. Setting the field separator character to the null string is clever!
I made the next step by parameterizing this line.
Code:
# Parameterize the word length and "must match" character positions.
WL=6
p1=2
p2=5
cat < $InFile \
|awk -F '' 'NF=='"$WL"' && $'"$p1"'==$'"$p2"' ' \
> $Work07
This works but the combination of single quotes and double quotes detracts from readability. Is there a cleaner way?
As you can see, one may pass variables to awk script using `-v' option.
I'd like to dissuade you from writing awk programs in C (as well as C++ programs in C etc) IMHO, each language has it own preferable thought patterns, and you should learn them, not only the syntax. In case of awk, typically, you should think of input data as a sequence of records, each one consists of fields. Using this simple paradigm you can move mountains!
I have just started with unix and today started learning awk, this is my first post on this forum and do not know where to start a new thread so posting on this thrad.
Problem Details:
I tried to run the follwing command
ls -l | grep -v total | awk '{ print size is $5 bytes for $2 }' and it showed me this error:
syntax error The source line is 1.
The error context is
{ print size is $5 bytes >>> for <<< $2 }
awk: The statement cannot be correctly parsed.
The source line is 1.
while if I running this command : ls -l | grep -v total | awk '{ print size is $5 }' , it runs successfully with output as:
164
17146-rw-r--r-- 1 goyalank users 164 Mar 7 09:20 email
-rw-r--r-- 1 goyalank users 17146 Mar 7 13:49 task
To mention the detail the output of ls -l is :
-rw-r--r-- 1 goyalank users 164 Mar 7 09:20 email
-rw-r--r-- 1 goyalank users 17146 Mar 7 13:49 task
Any help is appreciable.
Last edited by s4sandeep; 03-14-2012 at 12:35 PM.
Reason: to mention more detail
Thanks a ton! That worked......
Can you also tell the step to create a new thead for a particular problem like the one I faced below....thanks again in advance.
Thanks a ton! That worked......
Can you also tell the step to create a new thead for a particular problem like the one I faced below....thanks again in advance.
Click on "Forum Tools" (next to "Search This Forum") -> "Post a New Thread".
Click on "Forum Tools" (next to "Search This Forum") -> "Post a New Thread".
Hello everyone I am currently in college taking a Linux course its been rough
although I was fine the first beginning 10 weeks now its getting really hard
i have to write two scripts one that tells me when my ip Changes and one that pulls out words out of a dictionary file from my professor and on that one i have to take out greater than or equal to 3 characters and less than or equal to 6 and put them in a empty file
i decided to use awk for the dictionary one and i cant figure out the right syntax ive been having trouble ive spent hours upon hours trying to figure these two out been two weeks now
anyways it would be great if someone can help me please
heres what i started out with
awk 'length 6=< && >=3 {printf "%d. %s\n"}' test > test1
cat test1
thanks guys
I agree with you, but the usual syntax of awk is what I wrote you:
awk ' condition { action } '
and using the usual syntax will not influence readability. Your original post:
awk '{length($0)=5 && substr($0,2,1)==substr($0,5,1)}{print}'
should work too, you only need to remove { } .
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.