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:
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)