2016-08-12 2 views
0

다음 코드가 있습니다.awk ignore case with NR

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 

"Mary is little lamb"을 bookName으로, "Kenny"를 authorName으로 입력하면 프로그램은 2을 출력합니다. 그러나 $lineNum은 출력을 생성하지 않습니다.

+1

'-v lineNum = "lineNum"을'-v lineNum = "$ lineNum"'으로 바꾸면 제대로 작동합니다. – John1024

+0

교체 후 awk는 여전히 대체하지 않습니다. 예를 들어 "MARY IS LAMB"라는 문자열이 있고'bookary' 변수를 "mary is lamb"로 입력하면 변수 newTitle을 subtit하지 않습니다 – JamesPoppycock

+2

Works4me. 그것이 당신을 위해 작동하지 않는다면, 당신은 어떤 문제를 보여주기 위해 몇 가지 샘플 입력과 출력을 보여주십시오. 일반적인 생각은 질문에 [최소한의 완전하고 검증 가능한 예]가 있어야한다는 것입니다 (http://stackoverflow.com/help/mcve). 지금까지이 질문은 완전하고 검증할만한 것이 아닙니다. – John1024

답변

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 
    } 
' 

하지만 당신이 정말로 쉘 + 그렙과 줄 번호를 얻을 수 AWK를 사용의 혼합으로 전체 스크립트를 시작해야 그냥 잘못된 접근입니다. 스크립트를 올바르게 작성하는 방법에 대한 새로운 질문을 게시하십시오.