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.
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".
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.