2014-01-29 142 views
1

我在分配期間遇到了一些困難,並希望進行一些說明。awk搜索多個字段

我有以下代碼可以通過作者和標題(或標題的一部分,例如查找樂高戰爭VI並返回2結果/找到剪刀手和找到3個結果)來查找書籍。 但是,如果作者是RETURN,則只能按標題查找。如果標題是RETURN,則只能由作者查找。

  • 問題來了,當我必須使用awk來查找作者和標題。

  • 任何人都可以在search_both函數上指導我嗎?問題是我無法搜索這兩個字段並打印出結果。

例如,如果我輸入作者=樂高和標題=樂高戰爭VI應該只有1個字段找到,這將打印出來。

樂高星球大戰VI - 樂高遺產,樂高公司,$ 15.98,20,15

#!/bin/bash 

function search_title 
{ 
    awk -F':' -v search="$Title" '$1 ~ search { i++; printf "%s, %s,$%s,%s,%s\n", $1, $2, $3, $4, $5 } END { printf "%d records found\n", i }' books.txt 
} 

function search_author 
{ 
    awk -F':' -v search="$Author" '$2 ~ search { i++; printf "%s, %s,$%s,%s,%s\n", $1, $2, $3, $4, $5 } END { printf "%d records found\n", i }' books.txt 
} 

function search_both 
{ 
    awk -F':' -v search="$Title" search1="$Author" '$1 ~ search && $2 ~ search1 { i++; printf "%s, %s,$%s,%s,%s\n", $1, $2, $3, $4, $5 } END { printf "%d records found\n", i }' books.txt 
} 

read -p $'Title: ' Title 
read -p $'Author: ' Author 

if [ "$Title" == "" ]; 
then 
search_author 
elif [ "$Author" == "" ]; 
then 
search_title 
else 
search_both 
fi 

所以books.txt的格式爲title:author:price:quantity:sold 這裏輸入的樣本,如果任何人希望看到:

樂高星球大戰VI - 樂高的遺產:樂高公司:$ 15.98:20:15

樂高星球大戰VI - 樂高的回報:假公司:$ 8.05:30:20

C++爲菜鳥:約翰剪刀手:$ 15.01:10:5

Java進行菜鳥:瑪麗剪刀手:$ 16.02:20:15

VB.NET的菜鳥:剪刀手愛德華:$ 17.03:30:25

+0

什麼是「問題」? – CFrei

+0

您是否曾嘗試在該函數中爲search1字段使用'-v'?當arg沒有被傳入時,那麼你在'search1'上匹配,這不是你想要的。 – n0741337

+0

謝謝,我明白了,現在你們指出來了!非常感謝。不小心我:D – user3245403

回答

0

不要直接在awk中使用shell變量,而是使用-v開關將它們傳遞給awk。

您可以搜索在awk命令多個字段:

awk -v title="$title" -v author="$auhtor" '$1 ~ title && $2 ~ author {print}' file 
+0

謝謝,我意識到現在你們指出來了!非常感謝。不小心我:D – user3245403

+0

不客氣,很高興有任何幫助。 – anubhava