awk搜索多个字段

时间:2014-01-29 06:17:04

标签: bash search awk

我在任职期间遇到了一些困难,希望得到一些澄清。

我有以下代码来查找作者和标题的书(或标题的一部分,例如找到乐高战争VI并返回2结果/找到Scissorhands并找到3个结果)。 但是,如果作者是RETURN,则仅按标题查找。如果title是RETURN,则只能由作者查找。

  • 当我必须使用awk找到作者和标题时,问题就来了。

  • 任何人都可以指导我使用search_both函数吗?问题是我无法搜索这两个字段并打印出结果。

例如。如果我输入author = Lego和title = Lego Wars VI,则应该只找到1个字段,这将打印出来。

Lego Wars VI - Lego Legacy,Lego Company,$ 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 ++ for noobs:John Scissorhands:15.01:10:5

     

Java for noobs:Mary Scissorhands:16.02:20:15

     

VB.NET for noobs:Edward Scissorhands:17.03:30:25

1 个答案:

答案 0 :(得分:0)

不要直接在awk中使用shell变量,而是使用-v开关将它们传递给awk。

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

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