2014-01-30 73 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