2014-01-29 141 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