awk problem


 
Thread Tools Search this Thread
Special Forums UNIX Desktop Questions & Answers awk problem
# 8  
Old 06-25-2011
I was showing you that you don't need a loop with redirection, because you only need to run awk once to get the first line.

[ -n "$var" ]

the "[" is a built-in for "test". try "help test" in your shell. this runs the loop once, because it just tests if var doesn't exist.

I think the easiest way though, if you want to print the first line in a file is

Code:
head -1 file

# 9  
Old 06-25-2011
Quote:
Originally Posted by mrbinoy
but for this cod which give second output
Code:
while read line do var=$(awk -F "|" '{if ( NR == 1 ) print $0 }') echo "$var" done < student.txt

Awk is printing the second line from file 1 because you have not supplied any input to the awk command. By default, with no input supplied, awk reads from stdin. The way that Ksh and bash function, anything reading from stdin within a while with redirection like this, will also read from the redirected input. So, the while loop reads the first line, and when awk is called it reads the rest, starting with line 2.

If you run this simple script, you will notice that the awk prints all lines except the first, and the while exits after running the awk only once because the end of stdin is reached:

Code:
#!/usr/bin/env ksh
while read x
do
    echo "read line: $x"
    echo "running awk"
    awk '{print ">>> " $0;}'
done <t1.data
exit

You are seeing awk print only one line because you have added the test NR == 1; this is making the behaviour a bit more difficult to understand.

If your goal is to read each line from file 1 (the student records) and use awk to do some processing on each, maybe you should just let awk parse the file directly rather than reading each line into a shell variable and attempting to work on it with awk. It is certainly more efficient to let awk do the file i/o in this case. Here's a sample:

Code:
awk -F \| '
    {
        printf( "student %s has student id %d and lives in %s\n", $2, $1, $NF );
    }
' <t1.data

I made assumptions about your input data and am sorry if they aren't correct, but this should provide enough illustration to get going again.

Quote:
the "[" is a built-in for "test".
And for the record, '[' is NOT a shell built-in. It is a binary, or somtimes a sym-link to the test command, and generally 'lives' in /usr/bin. The [[ expression ]] construct in Kshell and bash is built-in. Both expression types have similar, yet very different, functionality and using test is not as efficient.

Last edited by agama; 06-25-2011 at 03:14 PM.. Reason: clarification/typo
This User Gave Thanks to agama For This Post:
# 10  
Old 06-28-2011
Thanks for this useful posts...and what is the diff b/w if (---- ) and if [[--- ]]
# 11  
Old 06-28-2011
In Korn Shell and bash, the constructs if [[ expression ]] and if (( expression )) are interpreted by the shell. The if [ expression ] is actually a command that the shell executes; the '[' is the command name.

The first noticeable difference is the overhead that the '[' command requires as a new process must be started, the binary loaded, and then cleaned up all to evaluate the expression to determine true or false. If you don't need to use the single bracket command, it is much more efficient to use the built-in evaluation.

Something that isn't obvious is that Kshell treats the right hand side of the expression as a pattern; the test (or [ command) does not. This allows you to do something like this:

Code:
if  [[  $var_name == *"foo"* ]]

Bash might do this too; I'm not a heavy bash user so I don't know for sure.

The (( expression )) is meant for numerical expressions while the double bracketed version is meant for string expressions. While this is still supported:

Code:
if [[ $var -gt 10 ]]

Kshell will give a warning (when run with -n) that it is obsolete. This would be the preferred syntax:

Code:
if (( $var > 10 ))

I hope this has answered your question.
This User Gave Thanks to agama For This Post:
# 12  
Old 06-29-2011
segregating data with awk

from employee table,need to segregate to their respective departments and to store in separate file,can any body help
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

Hi I have two columns and I would like to create a third column based on how many lines away from a value of 1 in column 2, for example I have 1,0 2,0 3,0 4,0 5,0 6,1 7,0 8,0 9,0 10,0 11,1 And I want an output (6 Replies)
Discussion started by: garethsays
6 Replies

2. Shell Programming and Scripting

awk problem

i have an email list in file.txt with comma separated line1 - FIELD1,pippo@gmail.com,darth@gmail.com line2 - FIELD2,pippo@gmail.com,darth@gmail.com,sampei@gmail.com output=(awk -F ',' -v var="$awkvar" '$1==var {print $2,$3,$4}' spreadsheet.txt)but awk delete some letters at the... (8 Replies)
Discussion started by: pasaico
8 Replies

3. Shell Programming and Scripting

awk problem - combining awk statements

i have a datafile that has several lines that look like this: 2,dataflow,Sun Mar 17 16:50:01 2013,1363539001,2990,excelsheet,660,mortar,660,4 using the following command: awk -F, '{$3=strftime("%a %b %d %T %Y,%s",$3)}1' OFS=, $DATAFILE | egrep -v "\-OLDISSUES," | ${AWK} "/${MONTH} ${DAY}... (7 Replies)
Discussion started by: SkySmart
7 Replies

4. UNIX for Dummies Questions & Answers

Little problem with AWK

I thought I had solved this problem but after testing the script I came to realize that it is not doing what I need. So, here it goes again. This is the code: awk '/\>/{F=$2; N=$3; split(FILENAME, A, "."); getline; x = ">"}{print ">" A"-" x++" "F" " N"\n" $0}' This is the input file: ... (5 Replies)
Discussion started by: Xterra
5 Replies

5. Shell Programming and Scripting

awk problem

Find the number of files with sizes > 100KB in /, /bin, /usr, /usr/bin and /usr/sbin directories and output them in a two column format with the name of the directory and the number of files. i tried with awk $>ls -lh | awk '/^-/ && $5 >= 100k {print $8 $5}' but it is not working pls tell... (3 Replies)
Discussion started by: abhikamune
3 Replies

6. Shell Programming and Scripting

Problem with awk awk: program limit exceeded: sprintf buffer size=1020

Hi I have many problems with a script. I have a script that formats a text file but always prints the same error when i try to execute it The code is that: { if (NF==17){ print $0 }else{ fields=NF; all=$0; while... (2 Replies)
Discussion started by: fate
2 Replies

7. Shell Programming and Scripting

Awk problem: How to express the single quote(') by using awk print function

Actually I got a list of file end with *.txt I want to use the same command apply to all the *.txt Thus I try to find out the fastest way to write those same command in a script and then want to let them run automatics. For example: I got the file below: file1.txt file2.txt file3.txt... (4 Replies)
Discussion started by: patrick87
4 Replies

8. Shell Programming and Scripting

problem using awk

Hi there every body I'm new to shell scripting and there is a problem facing me,, please look at the following piece of code: awk ' BEGIN{ FS="<assertion id=\1"; RS="<assertion id=\"2"}/<assertion id=\"1/{print FS$2 > "/home/ds2/test/output.txt"} ' filename all I wanna do is to... (6 Replies)
Discussion started by: senior_ahmed
6 Replies

9. Shell Programming and Scripting

Problem with AWK

Hi All, How can i store a value of the unix command executed in AWK with system command. devise=`cut -c1-3 dvgp.txt` I wrote this command in awk as awk'{ code= sprintf("devise=`cut -c1-3 dvgp.txt`"); system(code); }' Is this correct. can you please suggest me how the code can be... (1 Reply)
Discussion started by: krishna_gnv
1 Replies

10. UNIX for Dummies Questions & Answers

AWK Problem

Hi, I posted something here about this yesterday but I can't seem to find it. I needed help writting a script which would append a file with new lines after every so many charachters. Example: (my original flat file) L60 LETTER OF CREDIT 60 DAYS W00 ON RECEIPT WIRE TRANSFER W30 NET... (12 Replies)
Discussion started by: gseyforth
12 Replies
Login or Register to Ask a Question