Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bashshell脚本中的awk_Bash_Shell_Awk - Fatal编程技术网

bashshell脚本中的awk

bashshell脚本中的awk,bash,shell,awk,Bash,Shell,Awk,我正在使用awk函数进行模式匹配。如果awk包含运算符符号,如++或-它将给我搜索错误 例如在搜索过程中 4查册 题目:21天C++编程 作者: 找到0条记录 但是没有C++实际上没有++,因为如果我输入C,我仍然会得到结果 4查册 标题:21天编程 作者: C++编程21天,黑客简,30.60,18,10美元 21天的C++编程,J.D.Edwards,$50.03,15,10 21天的C++编程,Paul Thompson,45.00,18,10美元 发现3项记录 这是awk编码 awk-F

我正在使用awk函数进行模式匹配。如果awk包含运算符符号,如++或-它将给我搜索错误

例如在搜索过程中

4查册 题目:21天C++编程 作者:

找到0条记录

但是没有C++实际上没有++,因为如果我输入C,我仍然会得到结果

4查册 标题:21天编程 作者:

C++编程21天,黑客简,30.60,18,10美元

21天的C++编程,J.D.Edwards,$50.03,15,10

21天的C++编程,Paul Thompson,45.00,18,10美元

发现3项记录

这是awk编码

awk-F':'-v search=$title'$1~search{i++;printf%s,%s,$%s,%s\n,$1,$2,$3,$4,$5}END{printf%d条记录已找到\n,i}'BookDB.txt

更新: 我已经尝试了几个小时,但仍然无法解决问题,如果我想在找到0记录时在底部添加一个名为Book is not found的新行,我该怎么做

如何使其也不区分大小写

     awk  -F':' -v search="$title" '{ if($1 == search) {printf "%s, %s,%s,%s,%s\n", $1, $2, $3, $4, $5; i++ } else {printf "Book not found"} }END {printf "%d records found\n", i}' BookDB.txt 
这给了我类似的东西

Book not found  
Book not found 
c++ programming in 21 days 
Book not found
这不会显示“找不到书本”消息

 if [ "$title" != "" ] && [ "$author" = "" ] ; then  
 awk  -F':' -v search="$title" '{ if($1 == search) {printf "%s, %s,%s,%s,%s\n", $1, $2, $3, $4, $5; i++ } else {printf "Book not found"} }END {printf "%d records found\n", i}' BookDB.txt 
 if [ "$i" < 1 ]; then
 echo -n "Book not found"
 fi
$1~ search将变量search视为正则表达式。如果不希望这样,可以使用index函数来搜索文字字符串,而不是正则表达式:

$ title='C++ Programming in 21 Days'
$ awk  -F: -v search="$title" '(index($1, search) != 0) { i++; printf "%s, %s,%s,%s,%s\n", $1, $2, $3, $4, $5 } END { printf "%d records found\n", i }' BookDB.txt 
C++ Programming in 21 Days,  Hacker Jane,$30.60,18,10
C++ Programming in 21 Days,  J. D. Edwards,$50.03,15,10
C++ Programming in 21 Days,  Paul Thompson,$45.00,18,10
3 records found
索引$1,search返回字符串$1中字符串搜索的位置。若未找到搜索,则索引返回0

我将-F':'更改为-F:。这是因为:不是shell活动角色。引用它没有坏处,但引用是没有必要的

更新问题 要获取找不到的书籍,请执行以下操作:

如果您有GNU awk gawk,那么添加不区分大小写很容易:

awk  -F: -v search="$title" 'BEGIN{IGNORECASE=1;} (index($1, search) != 0) { i++; printf "%s, %s,%s,%s,%s\n", $1, $2, $3, $4, $5 } END { if (i) printf "%d records found\n", i ; else print "Book not found";}' BookDB.txt
如果这使它更容易理解,下面是分布在多行上的相同代码:

awk  -F: -v search="$title" '
BEGIN{
    IGNORECASE=1;
}

(index($1, search) != 0){
    i++;
    printf "%s, %s,%s,%s,%s\n", $1, $2, $3, $4, $5
}

END{
    if (i) 
        printf "%d records found\n", i ;
    else
        print "Book not found";
}
' BookDB.txt

+是,表示一个或多个事件。您需要使用“\”来转义它不应该给您这个问题,除非它是[xyz pqa]格式。awk不是bash的一部分;它是一种完全不相关的语言/工具。除非您的问题只能在结合使用bash和awk时生成,否则这纯粹是一个awk问题,根本不是bash问题。顺便说一句,您的后续问题很容易回答,其核心是将if/else语句放在每一行上运行的块中,而不是放在结束块中。然而,在你的问题中修改额外的问题在这里是不符合犹太教的;这不是非典型的看到一个mod回滚这样的编辑。这回答了你的问题吗?嗨,我更新了我的问题,如果你能帮助我,谢谢。我是bash的新手,所以我正在尝试玩around@user3848196,在你已经有了答案之后,以一种改变其含义的方式更新一个问题在这里是不符合犹太教义的。如果你有其他问题,应该独立提问。
awk  -F: -v search="$title" '
BEGIN{
    IGNORECASE=1;
}

(index($1, search) != 0){
    i++;
    printf "%s, %s,%s,%s,%s\n", $1, $2, $3, $4, $5
}

END{
    if (i) 
        printf "%d records found\n", i ;
    else
        print "Book not found";
}
' BookDB.txt