awk忽略NR的情况

时间:2016-08-12 05:12:49

标签: bash shell awk

我有以下代码。

awk -F":" -v bookName="$bookName" -v newTitle="$newTitle" -v lineNum="lineNum" 'NR==lineNum{gsub(bookName, newTitle)}1'

此代码基本上将书名更新为新标题。 lineNum包含已设置的行号的值,但此处未显示代码。

我希望这行代码忽略bookName的情况,但是我尝试的以下代码不起作用。

awk -F":" -v bookName="$bookName" -v newTitle="$newTitle" -v lineNum="$lineNum" 'BEGIN{IGNORECASE=1} NR==lineNum{gsub(bookName, newTitle)}1'

为什么会这样?

根据John's回复

进行修改

*最新编辑: 基本上我的代码如下:

read -r bookName
read -r authorName

if grep -iqx "$bookName:$authorName" cutText.txt
then
lineNum=`awk -F":" -v bookName="$bookName" 'BEGIN{IGNORECASE=1} $0 ~ bookName ":" authorName {print NR}' BookDB.txt`

echo $lineNum
else
echo "Failed"
fi

cutText.txt包含:

Hairy Potter:Rihanna
MARY IS A LITTLE LAMB:Kenny
Sing along:May

BookDB.txt包含

Hairy Potter:Rihanna:2:5:20
MARY IS A LITTLE LAMB:Kenny:39:2:1
Sing along:May:38:2:48

如果我要输入"玛丽是一只小羊羔"如bookName和"肯尼"如authorName,程序应输出2。但是,$lineNum不会产生任何输出。

1 个答案:

答案 0 :(得分:1)

IGNORECASE特定于gawk,你不能使用gawk。便携地:

awk ... '
    NR==lineNum {
        if ( match(tolower($0),tolower(bookName)) ) {
            $0 = substr($0,1,RSTART-1) newTitle substr($0,RSTART+RLENGTH)
        }
        print
    }
'

但你真的需要重新开始使用整个脚本,因为shell + grep和使用awk来获取行号只是错误的方法。发布一个新问题以获取有关如何正确编写脚本的帮助。