Writing a shell script that receives 3 arguments but within the script one of the commands needs to check the first value after a delimiter is applied
#!/bin/bash
awk -F'\t' '$1 ~ /$1/&&/$2/ {print $1FS$3}' $3
this command is called:
bash search.sh 5 AM filename.txt
And should execute as follows:
awk -F'\t' '$1 ~ /5/&&/AM/ {print $1FS$3}' filename.txt
The command functions properly outside of the shell script, returns nothing right now when using it inside the shell script. filename.txt :
03:00:00 AM John-James Hayward Evalyn Howell Chyna Mercado
04:00:00 AM Chyna Mercado Cleveland Hanna Katey Bean
05:00:00 AM Katey Bean Billy Jones Evalyn Howell
06:00:00 AM Evalyn Howell Saima Mcdermott Cleveland Hanna
07:00:00 AM Cleveland Hanna Abigale Rich Billy Jones
Expected output:
05:00:00 AM Billy Jones
CodePudding user response:
Your arguments are not being expanded when you single quote them. Here double quoting what you want the shell to expand, and single quote what you want awk to see:
#!/bin/bash
awk -F'\t' "$1 ~ /$1/&&/$2/"' {print $1FS$3}' "$3"
and to @JohnKugelman's point of using awk variables to more clearly separate shell and awk code:
#!/bin/bash
awk -F'\t' -vp="$1" -vp2="$2" '($0 ~ p && $0 ~ p2) {print $1FS$3}' "$3"
I use generic variable names here (p
and p2
) to emphasize that you are not anchoring your regex so they really do match on the hole line instead of hour and am/pm as intended.
CodePudding user response:
Don't embed shell variables in an awk script.
Here's a solution with some explanatory comments:
#!/bin/bash
[[ $# -lt 2 ]] && exit 1 ## two args required, plus files or piped/redirected input
hour="$(printf 'd' "$1")" ## add a leading zero if neccesary
pm=${2^^} ## capitalise
shift 2
time="^$hour:.* $pm\$" ## match the whole time field
awk -F '\t' -v time="$time" \
'$1 ~ time {print $1,$3}' "$@" ## if it matches, print fields 1 and 3 (date, second name)
Usage is bash search.bash HOUR PM [FILE] ...
, or ./search HOUR PM [FILE] ...
if you make it executable. For example ./search 5 am file.txt
or ./search 05 AM file.txt
.
I'm assuming that every field is delimited by tabs.