在我的文本文件中,我有一个书籍列表,按标题,作者,价格分类。 例如,
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
搜索和打印没有问题,但如果我颠倒顺序,在标题字段中输入作者姓名,我仍然会得到相同的结果。怎么了?
答案 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
...我实际上没有运行所有这些代码,但“它应该可以工作”; - )