awk construct unfamiliar to me


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers awk construct unfamiliar to me
# 1  
Old 07-28-2012
awk construct unfamiliar to me

Please help me out: I've seen this construct
Code:
awk '{...}1'

several times, like in scrutinizer's today's post
Code:
awk '{for(i=2;i<=NF;i++)if($i==$1)$i=RS $i}1' infile

but I can't find (manuals, man pages, internet FAQs,...) an explanation of what it does resp. stands for. Any hint is appreciated!
# 2  
Old 07-28-2012
Awk's basic syntax is <expression> {<code-block>}. If expression evaluates to true, the associated block is executed. Either may be omitted; if the expression is omitted, true is assumed, and if the code block is omitted "print" is assumed. 1 evaluates as the expression to true, and so the single 1 imples 1 { print }.

---------- Post updated at 10:42 ---------- Previous update was at 10:37 ----------

Looking at the example you gave, this is how I would have written it:

Code:
awk '{for(i=2;i<=NF;i++)if($i==$1)$i=RS $i; print;}' input-file

It might be easier to see the difference if not smashed all on one line:

Code:
awk '
   {
      for( i=2; i<=NF; i++ )
         if( $i == $1)
            $i = RS $i; 
      print;
   }' input-file


Last edited by agama; 07-28-2012 at 11:44 AM.. Reason: typo
# 3  
Old 07-28-2012
OK, understood. But "1" being the
Code:
<expression>

is placed after the
Code:
{<code-block>}

in above example. How that?
# 4  
Old 07-28-2012
It would be the expression for the next block like this:

Code:
awk '
   {
      for( i=2; i<=NF; i++ )
         if( $i == $1)
            $i = RS $i; 
   }

   1 { print; }
' input-file

Obviously this is overkill, but it illustrates the short-cut that was taken.
This User Gave Thanks to agama For This Post:
# 5  
Old 07-28-2012
I would put forward though that leaving out the default action {print $0} is no more a short-cut than leaving out the default condition 1, and also print prints the default value, which is $0 (and the semicolons are unnecessary). So in full it would be..
Code:
awk '
   1 {
     for( i=2; i<=NF; i++ )
       if( $i == $1 )
         $i = RS $i
   }

   1 { 
     print $0
   }
' infile

Which can of course be combined into 1 block, since the condition is the same (like agama did in post #2)..

I sometimes have a preference for one-liners because I think they are sometimes easier to read (but only if they are short, true one-liners (fewer than 65 characters), and they are great for cutting and pasting or just composing on the command line..

Last edited by Scrutinizer; 07-28-2012 at 06:17 PM..
# 6  
Old 07-29-2012
Thanks to both of you. I regarded the {...} in front of the 1 to be the <action block> so the lonely 1 fooled me. Adding "; print" to the "action block" would have done the task as well, I see now. "always learning" as agama states!
 
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How would I construct a (possibly simple) IF statement?

Hi all, I thought this would be simple, but I've been having a lot of trouble trying to write this IF statement, if I may ask for help pls: In BASH, how would I construct the if statement: Should ONLY be true if USEROPTscript=="yes"]] AND $mode=="INSTALL" /or/ $mode=="CHANGE" ]]... (3 Replies)
Discussion started by: jmccoughlin
3 Replies

2. Shell Programming and Scripting

Construct path

Hi, I need to construct the below path from the two available directory path, O/P /home/data/test/run/ht/WEB/HTML /home/data/test/run/ht/WEB/JSP /home/data/test/run/ht/WEB/CSS Path:1 ------ /home/data/test/run/ Path:2 ------ /home/data/share/app/01/lang/ht/WEB/HTML... (5 Replies)
Discussion started by: vel4ever
5 Replies

3. Shell Programming and Scripting

Help with if-else construct

Hi all i have been trying to do a small 'question and answer' script using if-else statement and a combination of pipe. I have succeeded in allowing the user to login with user name and password stored in a sequence username/password in a file named "pass" like this: echo "please enter your... (14 Replies)
Discussion started by: arikutex
14 Replies

4. Shell Programming and Scripting

Unfamiliar array syntax

I recently was handed responsibility for a script which has array references that are new to me and I could use some help understanding them. Parts of the config file and script are included. This script collects backups from a jail server of the jails running on that host. Several jail... (1 Reply)
Discussion started by: thumper
1 Replies

5. Shell Programming and Scripting

syntax error in the if construct

Hi can anyone tell me why is this code giving error mode=$1 if ] || ] then echo "MODES:" exit 1 fi Thanks (5 Replies)
Discussion started by: Anteus
5 Replies

6. Shell Programming and Scripting

if-else construct not working

Hi all, Sorry to ask this easy question but I am stuck. In a scenario i am executing one shell script which contains a if - else construct : if ; then echo $line $line >> successful_build.txt else $line >> failed_services.txt fi explaination : if the... (5 Replies)
Discussion started by: bhaskar_m
5 Replies

7. UNIX for Advanced & Expert Users

unfamiliar errors

I was checking my error logs today and ran into some errors I have not seen before maybe somebody has run into these before? /etc/cron.quarter-hourly/owusers.sh: Set effective gid to mail(12) failed! /usr/local/mailwatch/check_sendmail_relay.sh: line 8: thanks (1 Reply)
Discussion started by: mcraul
1 Replies

8. Shell Programming and Scripting

ksh construct

Hi Guys, could someone tell me what this ksh construct does typeset -r PROG_PWD=${0%/*} does I understand the -r for readonly but I would very much appreciate a definitive account of what this will set $PROG_PWD to. If I run this at the cmd line it it gets set to /usr/bin but I would... (2 Replies)
Discussion started by: ajcannon
2 Replies

9. Shell Programming and Scripting

Problem with looping construct

Hi all I have tried to search for this, but keep getting a MySQL db connect error, so am posing the question here, and taking a risk of incurring the wrath of the mods with my first post... I have the following test script: #!/bin/bash HTTPD=`/bin/ps -axcu | /usr/bin/grep httpd... (6 Replies)
Discussion started by: mikie
6 Replies
Login or Register to Ask a Question