我的程序应该能够以这种方式工作。
以下是名为BookDB.txt的文本文件的内容 个人用冒号(:)分隔,文本文件中的每一行都应作为一组信息,按照下面的顺序排列。
名称:著者:价格:QtyAvailable:QtySold
Harry Potter - The Half Blood Prince:J.K Rowling:40.30:10:50
The little Red Riding Hood:Dan Lin:40.80:20:10
Harry Potter - The Phoniex:J.K Rowling:50.00:30:20
Harry Potter - The Deathly Hollow:Dan Lin:55.00:33:790
Little Prince:The Prince:15.00:188:9
Lord of The Ring:Johnny Dept:56.80:100:38
我其实打算 1)逐行读取文件并将其存储在数组中 2)显示它
但是我不知道如何开始第一个。 从在线研究开始,下面是我到目前为止编写的代码。
#!/bin/bash
function fnReadFile()
{
while read inputline
do
bTitle="$(echo $inputline | cut -d: -f1)"
bAuthor="$(echo $inputline | cut -d: -f2)"
bPrice="$(echo $inputline | cut -d: -f3)"
bQtyAvail="$(echo $inputline | cut -d: -f4)"
bQtySold="$(echo $inputline | cut -d: -f5)"
bookArray[Count]=('$bTitle', '$bAuthor', '$bPrice', '$bQtyAvail', '$bQtySold')
Count = Count + 1
done
}
function fnInventorySummaryReport()
{
fnReadFile
echo "Title Author Price Qty Avail. Qty Sold Total Sales"
for t in "${bookArray[@]}"
do
echo $t
done
echo "Done!"
}
if ! [ -f BookDB.txt ] ; then #check existance of bookdb file, create the file if not exist else continue
touch BookDB.txt
fi
"HERE IT WILL THEN BE THE MENU AND CALLING OF THE FUNCTION"
感谢那些提前帮助过的人!
答案 0 :(得分:3)
为什么要将整个内容读入数组?在需要信息时查询文件:
#!/bin/sh # untested code: # print the values of any line that match the pattern given in $1 grep "$1" BookDB.txt | while IFS=: read Title Author Price QtyAvailable QtySold; do echo title = $Title echo author = $Author done
除非您的文本文件非常大,否则您不太可能需要数组中的数据。如果它足够大,你出于性能原因需要它,你真的不应该在sh中编码。
答案 1 :(得分:2)
由于您的目标似乎很明确,如何使用awk
作为使用bash
数组的替代方法?通常使用正确的工具来使工作变得更容易!
以下awk
脚本可以为您提供所需的内容:
# This will print your headers, formatted the way you had above, but without
# the need for explicit spaces.
BEGIN {
printf "%-22s %-16s %-14s %-15s %-13s %s\n", "Title", "Author", "Price",
"Qty Avail.", "Qty Sold", "Total Sales"
}
# This is described below, and runs for every record (line) of input
{
printf "%-22s %-16s %-14.2f %-15d %-13d %0.2f\n",
substr($1, 1, 22), substr($2, 1, 16), $3, $4, $5, ($3 * $5)
}
代码的第二部分(花括号之间)为每一行输入运行。 printf
用于格式化输出,并使用给定的格式字符串打印出每个字段,由$1
,$2
等表示。在awk
中,这些变量用于访问记录的字段(在本例中为行)。 substr()
用于截断输出,如下所示,但如果您不介意不排队的字段,可以轻松删除。我假设“总销售额”应该是价格乘以销量数量,但您也可以轻松更新。
然后,您将此文件保存在books.awk
中,如下所示调用此脚本:
$ awk -F: -f books.awk books
Title Author Price Qty Avail. Qty Sold Total Sales
Harry Potter - The Hal J.K Rowling 40.30 10 50 2015.00
The little Red Riding Dan Lin 40.80 20 10 408.00
Harry Potter - The Pho J.K Rowling 50.00 30 20 1000.00
Harry Potter - The Dea Dan Lin 55.00 33 790 43450.00
Little Prince The Prince 15.00 188 9 135.00
Lord of The Ring Johnny Dept 56.80 100 38 2158.40
-F:
告诉awk
字段用冒号(:
)分隔,-f books.awk
告诉awk
要运行的脚本。您的数据保存在books
。
不完全是你要求的,但只是指向一个(IMO)更好的工具来完成这种工作! awk
一开始可能会令人生畏,但对于像这样的记录工作的工作来说真是太棒了!