Bash打印文本文件

时间:2014-01-30 14:05:22

标签: 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 个答案:

答案 0 :(得分:1)

好吧,你有两段相同的代码,只检查一个字符串是否是一行的一部分。如果您将作者输入标题字段,您最终会这样做:

awk "/$title/" Books.txt

当'title'设置为作者姓名时,与此完全相同(假设$ author也是作者姓名):

awk "/$author/" Books.txt

为了提高/使其更精确,您可以告诉awk仅计算给定列,即:

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

<强>更新

你的问题是“什么事情”,我已经解释过,但这里有一些实用的解决方案(只是在这里更新你的代码):

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

...我实际上没有运行所有这些代码,但“它应该可以工作”; - )