Sponsored Content
Top Forums Shell Programming and Scripting Does awk have parameter substitution? Post 302942740 by Don Cragun on Friday 1st of May 2015 12:08:34 AM
Old 05-01-2015
Quote:
Originally Posted by Michael Stora
Can I specify a default value to a variable in AWK like BASH in one statement using parameter substitution?

BASH example:
Code:
argument=${$1-"default if empty"} (BASH)

First, you have an extra dollar sign (shown in red above) that shouldn't be there.

Second: your default if empty string is misleading. With the form argument=${parm-word}, word is assigned only if parm is unset. If parm is set, but empty; argument will be set to the empty string.

To get what you probably intended (assign word if parm is set to an empty string or if parm is unset); you want:
Code:
argument=${1:-"default if unset or empty"}

Quote:
I know I can do:
Code:
argument=$1; sub ( "^$", "default if empty", argument) (AWK)

Mike
If I understand what you're trying to do (assign an awk variable the value of a shell variable if it is set and not empty, the easy way is to still use shell variable assignment:
Code:
awk -v argument=${1:-"default if unset or empty"} 'BEGIN{print argument}'

But, you can also do it entirely inside an awk script. Compare what happens with the following script:
Code:
#!/bin/ksh
date > now
awk -v v1="v1 -v" '
function setvars() {
	v1 = v1 ? v1 : "v1 unset, empty string, or 0"
	sub("^$", "v2 is unset or empty string", v2)
	printf("fn=%d, FILENAME=\"%s\"\nv1=\"%s\"\nv2=\"%s\"\n\n",
		fn, FILENAME, v1, v2)
}
BEGIN {	setvars()
}
FNR == 1 {
	fn++
	setvars()
	print fn, $0
	print ""
}
END {	print "in END clause"
	setvars()
}' v2='v2 before 1st file operand' now v1= v2= now v1=0 v2=0 now v1=abc \
   v2=def now v1='v1 after last file operand' v2=0

which, with any POSIX conforming shell such as bash or ksh (it has been tested with both) produces the output:
Code:
fn=0, FILENAME=""
v1="v1 -v"
v2="v2 is unset or empty string"

fn=1, FILENAME="now"
v1="v1 -v"
v2="v2 before 1st file operand"

1 Thu Apr 30 20:54:59 PDT 2015

fn=2, FILENAME="now"
v1="v1 unset, empty string, or 0"
v2="v2 is unset or empty string"

2 Thu Apr 30 20:54:59 PDT 2015

fn=3, FILENAME="now"
v1="v1 unset, empty string, or 0"
v2="0"

3 Thu Apr 30 20:54:59 PDT 2015

fn=4, FILENAME="now"
v1="abc"
v2="def"

4 Thu Apr 30 20:54:59 PDT 2015

in END clause
fn=4, FILENAME="now"
v1="v1 after last file operand"
v2="0"

If you want to try this on a Solaris/SunOS system, change awk to /usr/xpg4/bin/awk.
This User Gave Thanks to Don Cragun For This Post:
 

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

awk variable substitution

for the command below, it looks for the 3rd field value matching "P" and printing it. awk '{if ($3 == "P") print}' file how would i express this if i use a loop to find more that 1 variable fro a list? this doesn't seem to work... cat list | while read n do awk '{if ($3 == "$n") print}'... (1 Reply)
Discussion started by: apalex
1 Replies

2. Shell Programming and Scripting

Filed substitution with awk

guys, I'm trying to 9k lines of the following: aaa aaa 1 1 1 to aaa aaa 1 01 1 Im pretty ignorant when it comes to subtituting fields using awk any help ? Tony (1 Reply)
Discussion started by: tony3101
1 Replies

3. Shell Programming and Scripting

AWK substitution

I need to copy field 2 to field 3 for only those records that have the 1st field equal to account e.g. file account|123|789|xxx|yyy|zzz|... account_group|444|555|xxx|yy|zz|.... account|456|901|aaa|bbb|ccc|..... after running awk script should look like account|123|123|xxx|yyy|zzz|...... (4 Replies)
Discussion started by: klut
4 Replies

4. Shell Programming and Scripting

help with awk substitution

Hi again. A have a CSV-file in the following format: 2008.09.01,15:17:42,9227096485,9233175320,CTC10,SMS,0901151742098314,Target_MSIS DN_is_blacklisted I want to have an awk command that will say: If the first 3 digits of $4 does not begin with 922 or 923, then make $8 say "Invalid... (3 Replies)
Discussion started by: daytripper1021
3 Replies

5. Shell Programming and Scripting

Substitution using awk/gawk

Hello, I have a file containing lines such as: (1 104 (16) (17) (18) (102))$ (1 105 (16) (17) (19:21) (102))$ I would like to extract the numbers, only by using awk (or gawk). I do not want to use "sed" as it is very slow. For now my solution consists in... (2 Replies)
Discussion started by: jolecanard
2 Replies

6. UNIX for Dummies Questions & Answers

Parameter substitution with alias

Hello, in my .bashrc I tried to setup some aliases. alias scp_cmd="scp -P 8888 $1 me@somehost:." is supposed to copy a local file to somehost via scp. However it seems that the command line substitution does not work here. However this works: alias lst="ls -l $1" The above scp command can... (1 Reply)
Discussion started by: strobotta
1 Replies

7. Shell Programming and Scripting

Substitution in AWK

I am trying to use AWK to replace dallinux02 to dallinux03 everywhere in the servers.txt file and move it over to "awk2". Here is my script "awk2.awk": gsub(/dallinux02/, "dallinux03"); print > "awk2" I am trying to run this using the following: $ awk -f awk2.awk... (3 Replies)
Discussion started by: ora_umair
3 Replies

8. Shell Programming and Scripting

Parameter substitution with##

Hi experts I want to use the parameter substitution in the bash with ## to get a=mfs1000 (not the "mfs" maybe other string and the length is not the same" I want to get 1000 any help? I don't know use which pattern I use echo ${a##*} It doesn't work Lei (5 Replies)
Discussion started by: yanglei_fage
5 Replies

9. Shell Programming and Scripting

awk substitution

Hi all, I need some help with substitution in awk. Is it possible to substitute field from awk output with string from file? For example: zcat /SMS/CDR/cdr_TC/callLogs*_*_2013092710*.gz | sed 's/:/;/g' | awk -F";" '{if($2==1 && $10~/389123456789/) print $36";"$37}' 2;19733248 I want... (6 Replies)
Discussion started by: vasil
6 Replies

10. Shell Programming and Scripting

Parameter substitution is not working with sed

I am trying add a prefix variable(string) to command output. sed parameter substitution is not working. - I have found some issues on my end of testing,, please delete this thread for now. (1 Reply)
Discussion started by: kchinnam
1 Replies
All times are GMT -4. The time now is 12:56 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy