On Sat, Apr 16, 2022 at 09:27:52PM -0500, Kent West wrote: > -- data.txt -- > black berry 12 > blue berry 14 > raspberry 9 > huckle berry hound 3 > bare-knuckle sandwich 27 > > -- test.sh -- > #!/bin/bash > > file="data.txt" > > while read -r line; do > productID=$(awk -F' ' '{$NF=""; print $0}' <<< $line) > price=$(awk -F' ' '{print $NF}' <<< $line)
Two awks... > retail=$(($price * 2)) > printf "The price of \'$productID\' is \$$price. We will retail it for > \$$retail.\n" > done <$file > > > -- $./test.sh -- > The price of 'black berry ' is $12. We will retail it for $24. > The price of 'blue berry ' is $14. We will retail it for $28. > The price of 'raspberry ' is $9. We will retail it for $18. > The price of 'huckle berry hound ' is $3. We will retail it for $6. > The price of 'bare-knuckle sandwich ' is $27. We will retail it for $54. ... and you still left trailing whitespace on the product names. Also, your printf is wrong. You're injecting the variable contents into the format argument. You should be using %s placeholders in the format, and then passing each variable as a separate argument. Here's a version that uses zero forks, and removes the trailing whitespace correctly. It's the same parameter expansion with extended globs that I showed earlier in this thread. unicorn:~$ cat foo #!/bin/bash shopt -s extglob while read -r line; do price=${line##*[[:space:]]} retail=$((price * 2)) product=${line%%+([[:space:]])"$price"} printf "The price of '%s' is \$%d. We will retail it for \$%d.\n" \ "$product" "$price" "$retail" done unicorn:~$ ./foo < data.txt The price of 'black berry' is $12. We will retail it for $24. The price of 'blue berry' is $14. We will retail it for $28. The price of 'raspberry' is $9. We will retail it for $18. The price of 'huckle berry hound' is $3. We will retail it for $6. The price of 'bare-knuckle sandwich' is $27. We will retail it for $54.