2014-01-30 5 views
0

Внутри моего текстового файла у меня есть список книг, которые идут по названию, автору, цене. Например,Bash печать текстового файла

Harry Potter - The Half Blood Prince:J.K Rowling:39.99 

Название, автор и цена все разделены ":" разделителем.

У меня есть два варианта, поиск по названию и/или автор. Ввод читается, если один из них оставлен пустым.

elif [ "$title" == "" ] 
then 
    count=`grep -c "$author" Books.txt` 
    echo "Found $count Records: " 
    awk "/$author/" Books.txt  
    if [ "$count" -eq 0 ] 
    then 
     echo "Book not found!" 
    fi 
elif [ "$author" == "" ] 
then 
    count=`grep -c "$title" Books.txt` 
    echo "Found $count Records: " 
    awk "/$title/" Books.txt   
    if [ "$count" -eq 0 ] 
    then 
     echo "Book not found!" 
    fi 

Там нет проблемы поиска и печати, но если я инвертировать заказ, введя имя автора в поле заголовка, я до сих пор получить тот же результат. Что происходит?

ответ

1

Ну, у вас есть два одинаковых кода, которые просто проверяют, является ли строка частью строки. Если вы вводите автора в поле заголовка, вы в конечном итоге делает это:

awk "/$title/" Books.txt 

который, когда «название» устанавливается на имя автора, делает точно то же самое, как это (при условии, что $ автор является Н. авторы называют здесь):

awk "/$author/" Books.txt 

чтобы улучшить/сделать его более точным вы могли бы сказать AWK рассчитывать только для данного столбца, то есть:

author="J.K Rowling" 
awk -F ':' -v author="$author" '$2 == author' Books.txt 

UPDATE

Ваш вопрос «что случилось», что я объяснил, но вот какое-то практическое решение для вас (просто обновляя свой код здесь):

elif [ "$title" == "" ] 
then 
    count=$(awk -v author="$author" -F ':' '$2 == author { c++ } END { print c }' Books.txt) 
    if [ "$count" -eq 0 ] 
    then 
     echo "Book not found!" 
    else 
     echo "Found $count Records: " 
     awk -v author="$author" -F ':' '$2 == author' Books.txt 
    fi 
elif [ "$author" == "" ] 
then 
    count=$(awk -v title="$title" -F ':' '$2 == title { c++ } END { print c }' Books.txt) 
    if [ "$count" -eq 0 ] 
    then 
     echo "Book not found!" 
    else 
     echo "Found $count Records: " 
     awk -v title="$title" -F ':' '$2 == title' Books.txt 
    fi 

... Я не на самом деле запустить весь этот код, но «он должен работать» ;-)

+0

привет спасибо за ответ. можете ли вы сказать мне, что мне делать? – user3001342

+0

Я сделал обновление, которое добавляет что-то, что вы можете сделать ... но он оставляет некоторые вещи для вас, чтобы выяснить;) – bryn

+0

Сделал еще одно обновление с решением, далеко за пределами того, что вы просили;) – bryn

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