2014-01-29 6 views
1

Я столкнулся с трудностями во время моего задания и хотел бы получить некоторые разъяснения.awk для поиска нескольких полей

У меня есть следующий код, чтобы найти книгу по автору и названию (или часть названия, например, найти Lego War VI и вернуть 2 результат/найти Scissorhands и найти 3 результата). Однако, если автор RETURN, найдите только по названию. И если заголовок RETURN, найдите только автор.

  • Проблема возникает, когда я должен использовать awk для поиска и автора, и названия.

  • Может ли кто-нибудь вести меня по функции search_both? проблема в том, что я не могу выполнить поиск в обоих полях и распечатать результат.

Например,. Если бы я набирал author = Lego и title = Lego Wars VI, должно быть найдено только одно поле, которое будет распечатано.

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 Вот пример ввода, если кто-то хотел бы видеть:

Lego Wars VI - Lego Legacy: Lego Компания: $ 15,98: 20: 15

Lego Wars VI - Возвращение Лего: Поддельные Компания: $ 8,05: 30: 20

C++ для недоносков: Джон Scissorhands: $ 15,01: 10: 5

Java для недоносков: Mary Scissorhands: $ 16,02: 20: 15

VB.NET для недоносков: Эдвард Руки-ножницы: $ 17,03: 30: 25

+0

что «проблема»? – CFrei

+0

Вы пытались использовать '-v' для поля search1 в этой функции? Когда аргумент arg не передается, вы соответствуете «search1», который не тот, который вы хотите. – n0741337

+0

Спасибо, я понимаю, что теперь после того, как вы, ребята, указали это! большое спасибо. небрежно меня: D – user3245403

ответ

0

Не используйте переменные оболочки непосредственно в awk, но передайте их awk, используя переключатель -v.

Вы можете найти несколько полей в команде AWK:

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

Спасибо, я понимаю, что теперь после того, как вы, ребята, указали это! большое спасибо. небрежно меня: D – user3245403

+0

Добро пожаловать, рад помочь. – anubhava

Смежные вопросы