Bash计算从文本文件打印出来

时间:2014-07-23 03:32:05

标签: bash awk

我尝试创建的脚本将具有两个功能。但是,如果有人可以指导我,我会面临一些错误并感激不尽。

  1. 使用基于" Price"的字段计算利润。和"已售出数量"。
  2. 打印文本文件中的所有内容。
  3. 我的BookDB文本文件中的数据格式如下所示。文本文件只包含5个字段,第6个引用利润的字段只能显示而不能保存到文本文件中。我的数据库中的分隔符是":"。

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

    以下是所需的输出

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

    现在,我的输出是这样的

    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
    

    以下是我的编码,如果有人能在编码中告诉我我的错误

    ,请感谢
    #!/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`
    

2 个答案:

答案 0 :(得分:0)

这是礼物。到目前为止,这是我的建议。

#!/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

答案 1 :(得分:0)

一般来说,awk需要>在其文件输出的语法中。所以它可能很简单:

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,