how to fix this awk script?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting how to fix this awk script?
# 1  
Old 02-11-2009
how to fix this awk script?

i have a log file while looks like this

++
user_a blabla
blabla nas_b blabla user_d
this is a user_a
junk line
another junk line
user_c nas_m blabla
++

basically most of the lines contain a "user" keywords, and the rest of the lines do not have "user" at all.

So I have the following script, which just extracts the user part(if that line has a user keyword) from each line

awk '{ for (i=0; i<=NF; i++)
if($i~/user/)
{a=$i}
else
{continue}
{print a}
}' /tmp/test

and when I run it, I got the following result

user_a
user_d
user_a
user_a #<===actually there is no user in that line at all.
user_c

why this happens and how can I fix my script? thanks
# 2  
Old 02-11-2009
Tools

I think it is because you are always printing a value. So, you are not over-writing 'a' ni the instance of the 4th line, so when you print the variable, you are getting the last stored value of 'a'.
Perhaps as the first line ater your else, do a
Code:
a=""

to blank out the last 'a' value?
# 3  
Old 02-11-2009
I reliazed that problem, but it seems I can not fix the problem, here is the modified script

awk '{ for (i=0; i<=NF; i++)
if($i~/user/)
{a=$i}
else
{a="no"}
{ continue}
{print a}
}' /tmp/test

and the output change to

no
user_d
user_a
no
no

which is not correct at all.


Quote:
Originally Posted by joeyg
I think it is because you are always printing a value. So, you are not over-writing 'a' ni the instance of the 4th line, so when you print the variable, you are getting the last stored value of 'a'.
Perhaps as the first line ater your else, do a
Code:
a=""

to blank out the last 'a' value?
# 4  
Old 02-11-2009
With awk:

Code:
awk '{ 
  for (i=1; i<=NF; i++)
    if ($i ~ /user/)
      print $i
      }' infile

With Perl:

Code:
perl -lne'print $1 while /(user[^\s]*)/g' infile

With GNU grep:

Code:
grep -o 'user[^ \t]*' infile

# 5  
Old 02-11-2009
Thanks, I know in this example I gave, egrep is a better choice, but actually my real work is "finding out both "user" and "nas" part, and then print out the result.

below is the result I want

+
user_a nas_b
user_d nas_b
user_a
user_c nas_m
+

But the problem is, no matter how i modified my script, I just won't get the desired result...

[QUOTE=radoulov;302286540]With awk:

Code:
awk '{ 
  for (i=1; i<=NF; i++)
    if ($i ~ /user/)
      print $i
      }' infile

With Perl:
# 6  
Old 02-11-2009
Quote:
Originally Posted by fedora
Thanks, I know in this example I gave, egrep is a better choice, but actually my real work is "finding out both "user" and "nas" part, and then print out the result.

below is the result I want

+
user_a nas_b
user_d nas_b
user_a
user_c nas_m
+
I don't understand the logic ...
Why user_d nas_b?
# 7  
Old 02-11-2009
sorry, that was a typo
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

awk file subtracted by a fix value - conditioned

Hi all... i have been trying to make this work but I have been failing for 6 hours .. I know it should be something simple that I am missing to it would be great if you can help me ... I want to subtract a fixed value (lets set 1) from any value >=1 from the whole file my file looks like ... (4 Replies)
Discussion started by: A-V
4 Replies

2. Shell Programming and Scripting

awk if condition match and fix print decimal place

Hi All, I have problem in the middle of implementing to users, whereby the complaint is all about the decimal place which is too long. I need two decimal places only, but the outcome from command is always fixed to 6. See the sample : before: Sort Total Site Sort SortName Parts ... (3 Replies)
Discussion started by: horsepower
3 Replies

3. Shell Programming and Scripting

My script failed and can't fix it ?

Hi , I'd like to give you a little bit idea about my script which is used to get any generated file from remote server using ftp session then organized those file into directories based on their date ( at the end I supposed to have 1 months directories 20130401 20130402 ....20130430 ,... (27 Replies)
Discussion started by: arm
27 Replies

4. UNIX for Dummies Questions & Answers

Please help to fix awk script

Good morning, fellows. I would need to ask for your help in editing my awk script. Here is the original version: BEGIN { printf ("CRYST1 200.000 200.000 200.000 90.00 90.00 90.00 P 1 1\n") maxatoms=1000 natom=0 found_struct = 0 found_bond = 0 } { if( NF == 5 ) { foundff=0 natom++... (9 Replies)
Discussion started by: snysmumrik
9 Replies

5. Shell Programming and Scripting

Fix timestamp with Sed or Awk

Hi I am dealing with the following string: Date: Thur, 13 March 2011 01:01:10 +0000 I asked for help in another topic that converted a similar string: Date: Thur, 13 March 2011 9:50 AM To a 24 hr standard. The problem is that it comes out as: Date: Thur, 13 March 2011 9:50:00 +0000... (4 Replies)
Discussion started by: duonut
4 Replies

6. Shell Programming and Scripting

How to fix this awk

I have a script which will mask the 9th and 15th column in a record starting with BPR. The record looks like below before my script BPR*C*160860.04*C*ACH*CTX*01*072000326*DA*1548843*3006968523**01*071000013*DA*5529085*100323*VEN The record will be masked after my script parses this... (19 Replies)
Discussion started by: Muthuraj K
19 Replies

7. Shell Programming and Scripting

how to fix the column length in a file using Awk Prog

Hi I use the following code to read the file and to fix the length of the column of the record in the file 'Sample.txt' ls Samp* | awk ' { a=$1 } END{ FS="n" for(i=1;i<=NR;i++) { while( getline < a ) { f1=$0; print("Line::",f1); f2=substr(f1,1,10) print("Field1::",f2);... (10 Replies)
Discussion started by: meva
10 Replies

8. Shell Programming and Scripting

AWK record length fix

Hi Friends, Need some help in AWK. Working on AIX 5 Have been trying the following functionality to make the record length fixed: if( length(record) < 300 ) { printf("%-300s\n", record); } In my opinion it will apply some fillers in the end. Its is not making any... (4 Replies)
Discussion started by: kanu_pathak
4 Replies

9. Shell Programming and Scripting

fix a problem in this script

z=9 i=0 h=02 min=55 while do cat /home/barmecha/test | grep $h:$min >> /home/barmecha/file1 min=`expr $min + 1` if ; then h=`expr $h + 1` fi i=`expr $i + 1` done i have a log file with time wise log in it, this script help me to pull out logs of the give time interval...but the... (8 Replies)
Discussion started by: abhishek27
8 Replies

10. Shell Programming and Scripting

awk / shell - Fix broken lines and data

Gurus, I am struggling with a issue and thought I could use some of your expertise. Need Help with this I have a flat file that has millions of records 24|john|account ~ info |56| 25|kuo|account ~ journal |58| 27|kim|account ~ journal |59| 28|San|account ~ journal |60|... (3 Replies)
Discussion started by: rimss
3 Replies
Login or Register to Ask a Question