2012-01-25 14 views
1

私のプログラムはこのように動作するはずです。Bashシェルプログラミング変数をテキストファイルから配列に格納

以下は、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に保管してください)

それを表示しかし、Iどのように最初のものを始める方法についても考えていない。 オンラインで研究しているところから、私が今までに書いたコードは以下の通りです。

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

私が今投稿したこのコードチャンクにはエラーがあります。 – Andres

+0

どのようなエラーがありますか?質問に追加すると、私たちがあなたを助けやすくなります。 –

+0

行12:bookArray [数]:配列メンバーにリストを割り当てることができません – Andres

答えて

2

あなたの目標は明らかです。bashアレイを使用する代わりにawkを使用するのはどうですか?仕事のために適切なツールを使用すると、多くのことが楽になります!次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) 
} 

を(中括弧の間)コードの2番目のセクションでは、入力のライン毎に実行されます。 printfはフォーマットされた出力用で、与えられた書式文字列を使用して$1,$2などと表示されます。awkには、これらの変数がレコードのフィールド(この場合は行)にアクセスするために使用されます。 substr()は、以下に示すように出力を切り捨てるために使用されますが、フィールドが並んでいないかどうかを気にしないと簡単に削除できます。私は "Total Sales"がPrice Price Soldで売られていると仮定しましたが、簡単に更新することもできます。

その後、あなたは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は、最初は威圧することができますが、このようなレコードで作業するジョブにとっては素晴らしいことです!

+0

こんにちはダンFego、私は実際にあなたが上記のものと私のコードのいずれかを置き換える必要がありますか?申し訳ありませんが、これは初めてのことです。シェルプログラムの構文にはあまりよく慣れていません。 – Andres

+0

こんにちはダンFego、明らかに私は自分のコードで遊んでみました。それでもエラーが出てきました。 – Andres

+0

明らかに私は自分のコードで遊んだりしようとしました。それでもエラーが出てきました。 私は自分のコードを私の機能に組み込みました。これは、ユーザーがメニューから選択肢を入力した場合にアクティブにする必要があります。以下 My機能 '関数(私の関数) {BEGIN \t {\t printfの "%-22s%-16s%-14s%-15s%-13s%S \ n"、 "タイトル" となります、 "著者"、 "価格"、 "数量役に立つ。"、 "数量が販売"、 "総売上" \t} {printfの「%-22s%-16s%-14.2f%-15d%-13d %3 $ 5、$ 3、$ 3、$ 5} } awk -F:-f BookDB、%0.2f \ n "、部分文字列$ {$ 1:1:22}、部分文字列{$ 2:1:16} .awk BookDB.txt } ' 私はそれを実行しようとしたとき、それは悪い代替を言う。 – Andres

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でこれをコーディングするべきではありません。

+0

これは私がやることです。テーブルを配列に読み込むことはできません。行だけなので、ファイルから一度に1つの行を抽出するのは理にかなっています。どの時点で直接処理することもできます。ちなみに、あなたはおそらく 'while IFS =:read ...; do ... done <<(grep ...) 'というように、' while'の中の変数はスクリプトの残りの部分です。 – Sorpigal

+0

これは私にとって初めてのプログラムです。私を許してください、コードの上記のチャンク、それの一部は私が置き換える必要がありますか?私はまだカット機能が必要ですか? – Andres

+0

@Andresカットは一切必要ありません。 IFS =でreadを使用すると、それがすべてあなたのために働きます。 –

関連する問題