2015-01-11 2 views
0

У меня есть этот код ниже, который должен искать книгу, когда поле автора пуст. и он распечатает количество совпадений, и он распечатает номер соответствующей строки и покажет все детали книги. Но у меня есть проблема с информацией, которая отображается, если я запускаю этот код теперь будет отображаться в терминалеСценарий Сценарий Слишком плохой, нужна помощь

часть входного образца показан ниже

The Hunger Games:Suzanne Collins:10:1:50 
The Hunger Games:fake author:1:1:1 

и то, что было напечатано с кодом я используется показано ниже

Found 2 Records 
The Hunger Games 
The Hunger Games Suzanne Collins 
Fake Author $10 
1 50 
1 25 
1 

я желаю из положить, чтобы стать

Found 2 records 
The Hunger Games, Suzanne Collins, $10, 1, 50 
The Hunger Games, Fake Author, $1, 1, 1 

Надеюсь, кто-то сможет мне помочь. Благодаря

function search_book 
    { 

     echo "Enter Title: " 
     read title 
     echo "Enter Author: " 
     read author 
     result_title=$(grep -ise "$title\:" BookDB.txt) 
     record=$(grep -io "$title\:" BookDB.txt 
     if [ "$result_title" != "" ] && [ "$result_title" == "$result_title" ] && [ "$author" == "" ] 
     then 
     title=$(echo "$result_title" | cut -f 1 -d ":") 
     author=$(echo "$result_title" | cut -f 2 -d ":") 
     price=$(echo "$result_title" | cut -f 3 -d ":") 
     qty_ava=$(echo "$result_title" | cut -f 4 -d ":") 
     qty_sold=$(echo "$result_title" | cut -f 5 -d ":") 
     echo "" 
     echo "Found" $record "records:" 
     echo "" 
     echo -e "$title\t$author\t"\$"$price\t$qty_ava\t$qty_sold" 
     fi 
+1

Покажите нам ввод для этого скрипта. –

+3

Не могли бы вы разместить образец ввода BookDB.txt. Я думаю, что этот код можно упростить с помощью awk, чтобы получить всю информацию и распечатать желаемый результат. – ShellFish

+0

привет я добавил образец ввода в соответствии с просьбой жаль, что я забыл – Ken

ответ

0

Следующий скрипт должен удовлетворить ваши требования:

#!/bin/bash 

DB='./BookDB.txt' 
TMP_FILE='/tmp/Book_Search.tmp.txt' 

if [ ! -e "${TMP_FILE}" ] 
then 
     touch ${TMP_FILE} 
fi 

function search_book 
{ 
     echo "Enter Title: " 
     read title 
     echo "Enter Author: " 
     read author 
     if [ "${title}" = '' ] && [ "${author}" = '' ] # input test 
     then 
       echo 'You must provide Book Title and Author.' 
     else 
       grep -ise "${title}" ${DB} > ${TMP_FILE} #creates list of books matching title search criteria 
       index=0 
       while read line 
       do 

         title=$(echo ${line} | awk -F ":" {'print $1'}) 
         author=$(echo ${line} | awk -F ":" {'print $2'}) 
         price=$(echo ${line} | awk -F ":" {'print $3'}) 
         qty_ava=$(echo ${line} | awk -F ":" {'print $4'}) 
         qty_sold=$(echo ${line} | awk -F ":" {'print $5'}) 

         query_result[${index}]=$(echo "${title}, ${author}, \$${price}, ${qty_ava}, ${qty_sold}") #creates new array element for every book matching search criteria 
         index=$(($index+1)) 
       done < ${TMP_FILE} 
     fi 

     lines=$(echo ${#query_result[@]}) #assigning lines variable the total count of array elements 
     echo "Found results: $lines" 
     printf '%s\n' "${query_result[@]}" #using printf to print all array elements on new line 

} 

search_book 

Скрипт использует временный файл, в котором записаны все данные, относящиеся к этой категории. тест Текущий вход проверки, если пользователи ввели данные для обоих входов - название книги и автора, но вы должны изменить запись Grep, чтобы изменить результат запроса, который будет записан в TMP_FILE:

grep -ise "${title}" ${DB} > ${TMP_FILE} #after completion of this command there would be entries matching the ${title} search criteria in the ${TMP_FILE} temp file 

Вы необходимо изменить запись выше, чтобы соответствовать различным поисковым запросам. После сбора данных в $ {TMP_FILE} мы используем while, чтобы читать его по очереди и создавать массив, содержащий отформатированные данные, которые мы хотим распечатать, после успешного завершения скрипта.

1

Простой сценарий Awk был бы намного более изящным и идиоматичным, а также более эффективным.

awk -F : -v title="$title" -v author="$author" ' 
    tolower($1)==tolower(title) && (author=="" || tolower($2)==tolower(author)) { 
     a[++i]=$1 ", " $2 ", $" $3 ", " $4 ", " $5; next } 
    END { if (i) print "Found " i " records:" 
     for (j=1; j<=i; ++j) print a[j] }' BookDB.txt 

Если вы готовы напечатать резюме в конце, а не в начале, это можно было бы сделать более эффективным и упрощен до сих пор.

Вы можете написать простую оболочку Bash и сохранить ее в директории в PATH или обернуть ее в функцию. Тем не менее я бы посоветовал не выполнять ваши функции взаимодействия с пользователем, поскольку это затрудняет их использование в качестве составных блоков в более сложных сценариях.

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