2013-04-09 135 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 

我试图检查用户输入的书籍ID是否是唯一的。我正在做的是检查文件“exercise1_data.txt”,如果有任何“book_id”的实例。 while循环将被执行,直到用户输入唯一的书籍ID。使用AWK进行验证

我得到一个错误Too many arguments

回答

2

首先固定AWK:

您需要使用-v选项shell变量传递给awk

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

此外,如果$3==b_id你应该print 1exit作为匹配被发现。当我们到达文件末尾时,只有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 

注:

  • 总是引用你的shell变量。

  • 您在书文件中使用空格作为字段分隔符,这不会灵活,即书名,作者等都有空格。

+0

错误仍然存​​在......请你能帮组装代码..我是新来的awk编程... – debal 2013-04-09 18:09:50

+1

这是因为错误是'bash'错误不是'awk'错误。我已经添加了正确的'bash'脚本。请upvote并接受这个答案。 – 2013-04-09 18:23:34

+0

Thankyou在字段分隔符上的提示我真的没有想过这个。还有一些我想知道的。我所遵循的所有教程都表明,awk的语法为'awk'BEGIN {} {} END {}'',其中可以使用三者的任意组合。我在代码中看到了一些新东西:没有'if($ 3 == b_id)',并且是代码片段{{print 1;退出}'if语句的一部分或'awk进程段'的一部分。 – debal 2013-04-09 18:35:07