简体   繁体   中英

Bash to calculate print out from text file

The script I am trying to create will have two functions. However I am facing a some error and appreciate if someone can guide me.

  1. To calculate profit using the field based on "Price" and "Quantity Sold".
  2. Print out everything inside the text file.

The format of the data inside my BookDB text file is shown below. The text file contain only 5 field and the 6th field which refer to profit should only be shown and not saved into the text file. The delimiter in my database is ":".

Title:Author:Price:Quantity avilable:Quantity Sold
a(Title):b(Author):$1.00(Quantity.avilable):52:248(Quantity Sold)

Below is the desired output

Title:Author:Price:Quantity Available:Quantity Sold:Profit
A:B:1.00:20:10:$10

Right now, my output is like this

Advanced Book Inventory System
    1.) Inventory summary report
    2.) Quit
Enter selection: 1
6) inventory_summary_report
./filesearch.sh: line 17: (40.30

40.80
50.00
55.00
15.00
56.80
89.10
76.00
23.60
12.99
1.00)*(50
10
248): command not found
./filesearch.sh: line 18: BEGIN: command not found
Harry Potter - The Half Blood Prince,J.K Rowling,$40.30,10,50,Harry Potter - The Half 
Blood Prince:J.K Rowling:40.30:10:50
The little Red Riding Hood,Dan Lin,$40.80,20,10,The little Red Riding Hood:
Dan Lin:40.80:20:10

Below is my coding, appreciate if anyone can tell me my mistake in the coding

#!/bin/bash
clear
function press_enter
{
 echo ""
 echo -n "Press Enter to continue"
 read
 clear
}

  function inventory_summary_report
   {
    echo "1) inventory_summary_report"
    echo ""
    price="$(cat BookDB.txt | cut -d: -f3)"
    sold="$(cat BookDB.txt | cut -d: -f5)"
    sales=$(echo scale=3;"($price)*($sold)" |bc)
    BEGIN { printf "%s,%s,$%s,%s,%s,%s\n" , "Title", "Author", "Price", "Qty Avail", "Qty  Sold", "Total Sales" }
    awk -F':' -v search="$1" '$1 ~ search || $2 ~ search { i++; printf  "%s,%s,$%s,%s,%s,%s\n", $1, $2, $3, $4, $5,$sales} END { printf "%d records found\n", i }'     BookDB.txt
   }

  #Display menu options and wait for selection
    selection=0
    until [ "$selection" = "1" ]; do
     echo ""
     echo ""
     echo "Advanced Book Inventory System"
     echo ""
     echo ""
     echo " 1.) Inventory summary report"
     echo " 2.) Quit"

  echo -n "Enter selection: "
  read selection
   echo ""
   case $selection in
     1 ) inventory_summary_report;press_enter;;
     2 ) break ;;
     * ) tput setf 4;echo "Please enter 1 or 2, ";tput setf 7; press_enter
 esac
 done`

Here's a gift. So far this is what I can suggest.

#!/bin/bash

clear

function press_enter {
    echo ""
    echo -n "Press Enter to continue. "
    read
    clear
}

function inventory_summary_report {
    awk -F : -v search="$1" '
        BEGIN {
            OFS = "\t"
            print "Title", "Author", "Price", "Qty Avail", "Qty  Sold", "Total Sales"
            count = 0
        }
        $1 ~ search {
            printf "%s\t%s\t$%0.2f\t%s\t%s\t%0.2f\n", $1, $2, $3, $4, $5, ($3 * $5)
            ++count
        }
        END {
            printf "%d records found\n", count
        }
    ' BookDB.txt | column -t  ## Better than relying on constant column sizes with printf.
}

# Display menu options and wait for selection

selection=0

for (( ;; )); do
    echo ""
    echo ""
    echo "Advanced Book Inventory System"
    echo ""
    echo ""
    echo " 1.) Inventory summary report"
    echo " 2.) Quit"
    echo ""
    read -p "Enter selection: " selection
    echo ""
    case "$selection" in
    1)
        inventory_summary_report  ## You're not passing any argument for the search. You probably still need to ask input here.
        press_enter
        break  ## Optional.
        ;;
    2)
        break
        ;;
    *)
        tput setf 4
        echo "Please enter 1 or 2, "
        tput setf 7
        press_enter
        ;;
    esac
done

Generally speaking, awk requires > in its syntax for file output. So it may be as easy as:

awk -F':' -v search="$1" '$1 ~ search || $2 ~ search { i++; printf  "%s,%s,$%s,%s,%s,%s\n", $1, $2, $3, $4, $5,$sales} END { printf "%d records found\n", i }' > BookDB.txt, 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM