2013-04-09 4 views
1
a=1 

echo -n "Enter book id: "; read book_id; 
while [ $a -eq 1 ] 
do 
a=$(awk '{ if($3 == "$book_id") print 1; else print 0}' exercise1_data.txt) 
echo $a 
if [ $a -eq 1 ]; then 
echo -n "Please enter unique book id: "; read book_id 
fi 
done 

Я пытаюсь проверить, является ли введенный пользователем идентификатор книги уникальным или нет. То, что я делаю, это проверить файл «exercise1_data.txt», если есть какой-либо экземпляр «book_id». Цикл while должен выполняться до тех пор, пока пользователь не вводит уникальный идентификатор книги.Валидации с использованием AWK

Я получаю сообщение об ошибке Too many arguments

ответ

2

Во-первых, фиксируя AWK:

Вы должны передать переменные оболочки в awk используя -v вариант:

awk -v b_id="$book_id" '$3==b_id{print 1;exit}END{print 0}' exercise1_data.txt 

Кроме того, если $3==b_id вы должны print 1 и exit как встреча найдена. Только print 0, когда мы дойдем до конца файла (совпадения не найдено).


Во-вторых, сценарий:

$ cat file 
book_1 orielly 100 
book_2 wiley 101 

Сценарий:

#!/bin/bash 

a=1 

while [ "$a" -eq 1 ]; do 
    echo -n "Please enter unique book id: " 
    read book_id 
    let a=$(awk -v b_id="$book_id" '$3==b_id{print 1;exit}END{print 0}' file) 
    echo "$a" 
done 

Демо:

$ bash script.sh 
Please enter unique book id: 100 
1 
Please enter unique book id: 101 
1 
Please enter unique book id: 102 
0 

Примечания:

  • Всегда цитирует ваши переменные оболочки.

  • Вы используете пробелы в качестве разделителя полей в файле книги, это не будет гибким. В книгах названия, авторы и т. Д. Имеют пробелы.

+0

ошибка все еще сохраняется ... Пожалуйста, не могли бы вы помочь собрать код .. Я новичок в программировании AWK ... – debal

+1

Это потому, что ошибка была 'bash' ошибка не' awk' ошибка. Я добавил правильный скрипт 'bash'. Пожалуйста, поддержите и примите этот ответ. –

+0

Спасибо за подсказку в полевом сепараторе, я действительно об этом не думал .. Есть что-то еще, что мне было интересно. Все обучающие материалы, которые я привел, показали, что awk имеет синтаксис 'awk 'BEGIN {} {} END {}'', где может использоваться любая комбинация из трех. В вашем коде есть несколько вещей, которые я вижу в вашем коде: нет 'if ($ 3 == b_id)' и является фрагментом '{print 1; exit} 'часть инструкции' if' или часть 'awk process segment'. – debal

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