2014-01-30 170 views
0

在我的文本文件中,我有一個書目清單,按照標題,作者,價格排列。 「:」 分隔符 例如,Bash打印文本文件

Harry Potter - The Half Blood Prince:J.K Rowling:39.99 

標題,作者和價格都與分離。

我有兩個選擇,按標題和/或作者搜索。如果其中一個留空,則讀取一個輸入。

elif [ "$title" == "" ] 
then 
    count=`grep -c "$author" Books.txt` 
    echo "Found $count Records: " 
    awk "/$author/" Books.txt  
    if [ "$count" -eq 0 ] 
    then 
     echo "Book not found!" 
    fi 
elif [ "$author" == "" ] 
then 
    count=`grep -c "$title" Books.txt` 
    echo "Found $count Records: " 
    awk "/$title/" Books.txt   
    if [ "$count" -eq 0 ] 
    then 
     echo "Book not found!" 
    fi 

是沒有問題的搜索和打印功能,但如果我顛倒順序,輸入作者名到標題字段,我仍然會得到相同的結果。這是怎麼回事?

回答

1

那麼,你有兩件相同的代碼,只是檢查一個字符串是否是一行的一部分。如果輸入筆者到標題字段,你最終會做這樣的:

awk "/$title/" Books.txt 

,當「標題」設置爲作者的名字,不正是因爲這同樣的事情(因爲$作者是作者的名字在這裏太):

awk "/$author/" Books.txt 

爲了提高/使其更加精確,你能告訴AWK只在一定的列數,即:

author="J.K Rowling" 
awk -F ':' -v author="$author" '$2 == author' Books.txt 

UPDATE

你的問題是「怎麼了」,這我已經解釋過,但這裏是某種實用的解決方案爲你(只是在這裏更新您的代碼):

elif [ "$title" == "" ] 
then 
    count=$(awk -v author="$author" -F ':' '$2 == author { c++ } END { print c }' Books.txt) 
    if [ "$count" -eq 0 ] 
    then 
     echo "Book not found!" 
    else 
     echo "Found $count Records: " 
     awk -v author="$author" -F ':' '$2 == author' Books.txt 
    fi 
elif [ "$author" == "" ] 
then 
    count=$(awk -v title="$title" -F ':' '$2 == title { c++ } END { print c }' Books.txt) 
    if [ "$count" -eq 0 ] 
    then 
     echo "Book not found!" 
    else 
     echo "Found $count Records: " 
     awk -v title="$title" -F ':' '$2 == title' Books.txt 
    fi 

......我還沒有實際上運行所有這些代碼,但'它應該工作';-)

+0

嗨感謝您的答覆。你能告訴我該怎麼辦? – user3001342

+0

我做了一個更新,它增加了一些你可以做的事情......但它確實留下了一些東西給你弄清楚;) – bryn

+0

用解決方案做了另一次更新,遠遠超出了你所問的;) – bryn