how to fix this awk script?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting how to fix this awk script?
# 8  
Old 02-11-2009
an actual (with blah-s) file sample would be helpful. A desired output (based on a sample input) would not hurt either.
Please use vB Codes when posting samples/quotes.
# 9  
Old 02-11-2009
sure, let me be more clear, here is the file test

$more /tmp/test
user_a blabla nas_b
blabla nas_b blabla user_d
this is a user_a
another junk line
user_c nas_m blabla

please note, user and nas may or may not appear on each line, and the position of user and nas are not fixed, they can appear in any column.

I need a script to scan each line, if any line contains user or nas, or both, they will be extracted from the line and be printed out, and i want print user before nas if a line has both words. in my case, the result will be look like:

user_a nas_b
user_d nas_b
user_a
user_c nas_m

I tried to monky with awk for a while, but just can not figure out a good way to make it.

Any help will be greatly appreciated.
# 10  
Old 02-11-2009
Code:
awk  '/user|nas/{ for (i=1; i<=NF; i++) {
                   if ($i ~ /user/) printf $i FS 
                   if ($i ~ /nas/) a[i]=$i } 
                  for (j in a) printf a[j] FS
                  print "" ; split("",a) }' filename

# 11  
Old 02-11-2009
this script works for my example ! I must admit I don't understand this awk array thing, I figure there are tons of awk stuff to learn.

but the thing is, it appears that this script does not always work , for example, when I run the script against the following line, i got error

$more /tmp/test2
08:05:55.255412 rad-access-req 58 [id 57] Attr[ Service_type{Authenticate Only} user{Defcon} Pass nas_ipaddr{1.2.2.3} ] (DF)

and the error message is:

"awk: a is not an array
record number 1"


Quote:
Originally Posted by rubin
Code:
awk  '/user|nas/{ for (i=1; i<=NF; i++) {
                   if ($i ~ /user/) printf $i FS 
                   if ($i ~ /nas/) a[i]=$i } 
                  for (j in a) printf a[j] FS
                  print "" ; split("",a) }' filename

# 12  
Old 02-11-2009
Given your requirements, the code works fine either with gawk or old awk. Try to modify it to get your desired output.

Code:
$ cat file
user_a blabla nas_b
blabla nas_b blabla user_d
this is a user_a
another junk line
08:05:55.255412 rad-access-req 58 [id 57] Attr[ Service_type{Authenticate Only} user{Defcon} Pass nas_ipaddr{1.2.2.3} ] (DF)
another junk line
user_c nas_m blabla

$ awk  '/user|nas/{ for (i=1; i<=NF; i++) {
                   if ($i ~ /user/) printf $i FS 
                   if ($i ~ /nas/) a[i]=$i } 
                  for (j in a) printf a[j] FS
                  print "" ; split("",a) }' file

user_a nas_b
user_d nas_b
user_a
user{Defcon} nas_ipaddr{1.2.2.3}
user_c nas_m

# 13  
Old 02-11-2009
after I install gawk, problem fixed, thanks a lot!

Last edited by fedora; 02-12-2009 at 04:12 PM..
# 14  
Old 02-12-2009
sorry, one more question, I have been trying to read some awk documents, but apparently the time is just not enough for me to pick up the awk "array" very quickly. Right now I just saved the script.

If I insert one more keyword group into the test file, how can i tune this awk script to pick up all 3 keywords and print user first, nas second and group last?

exmple,
$more /tmp/test
user_a blabla nas_b group_a
blabla nas_b group_b blabla user_d
this is a user_a, group_c
another junk line
group_d user_c nas_m blabla

and the desire output

user_a nas_b group_a
user_d nas_b group_b
user_a group_c
user_c nas_m group_d

thank in advance SmilieSmilieSmilie!
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