我在任职期间遇到了一些困难,希望得到一些澄清。
我有以下代码来查找作者和标题的书(或标题的一部分,例如找到乐高战争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
答案 0 :(得分:0)
不要直接在awk中使用shell变量,而是使用-v
开关将它们传递给awk。
您可以在awk命令中搜索多个字段:
awk -v title="$title" -v author="$auhtor" '$1 ~ title && $2 ~ author {print}' file