Bash Shell编程将文本文件中的变量存储到数组中

时间:2012-01-25 13:42:30

标签: linux arrays shell unix ubuntu

我的程序应该能够以这种方式工作。

以下是名为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"

感谢那些提前帮助过的人!

2 个答案:

答案 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一开始可能会令人生畏,但对于像这样的记录工作的工作来说真是太棒了!