2014-07-23 37 views
1

我试图创建的脚本将有两个功能。但是,我面临一些错误,并感谢有人能指导我。打算从文本文件打印出来

  1. 使用基于“价格”和“已售数量”字段计算利润。
  2. 打印出文本文件中的所有内容。

我的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` 
+0

这是一个转让问题吗? –

+1

@RishiDua我认为这几乎是必须的。 :-)嘿OP!你的'awk'搞砸了。 BEGIN块不合适。另外,摆脱设置'price','sold'和'sales'的'bash'行,并计算'awk'中的所有内容。修改您的帖子以显示更改。 – ooga

回答

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 
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,