2013-05-28 91 views
1

如果匹配,我需要匹配某些圖案我需要打印接下來的幾個單詞..我只有三個這樣的條件匹配......但我需要只打印滿足第一個條件後出現的單詞.. iez ..awk:匹配特定圖案後的圖案和圖案旁邊的打印字

雖然在LLL SSS之前我有TTT,但我只需要打印LLL SSS到AAA RRR之後的那些,而當我遇到LLL SSS需要做同樣的事情,我試過聲明一個awk標誌變量,但它似乎不起作用。請幫助我。

var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR"; 
awk -v flag=1 '{ 
for (m=1;m<=NF;m++) 
if($m~m/'$var1'/ && $(m+1)~/'$var2'/) 
print "ABCD: ", $(m+2),$(m+3),$(m+4) 
{flag=0}; 
else { 
if {flag==0 && $m~/'var3'/) 
print "EFG : ", $(m+1); 
else { 
if (flag==0 && $m~/'$var4'/ && $(m+1)~/'var5'/) 
print "HIJ: ",$(m+2),$(m+3) 
{flag=1}; 
} 
} 
} 
}' fliename 

我的文件是這樣的:

AAA RRR H I 
DDDD OOO HI J UGC RR 
TTT YYY 
LLLLL IIIIII 
LLL SSS A B C D 
N 
DDDD TTT EFG 
BBB AAA RRR J K 
HHHHHH RRRRRR 
LLL SSS E H G H 
N 
DDDD TTT EFG 
UUUUU BBB AAA RRR J K 
+5

什麼是你期望的輸出? –

+1

擁有一個名爲'flag'的標誌就像擁有一個孩子並命名爲'kid'。來吧...還有如何縮進? –

+0

Andalso,你的代碼語法沒有多大意義。即使編輯也很難。 – Rubens

回答

3

當你有多個嵌套if就像這樣,它使用大括號是完全明確的是真正重要的。我試圖重寫你的代碼。

  • 使用-v通過shell變量到awk中,而不是使用引號
  • 空白是你的朋友玩 - 或者更確切地說,它是未來的傢伙誰也維護你的代碼的朋友。
  • 固定的幾個錯誤,在你的腳本行8
var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR"; 
awk -v flag=1 \ 
    -v var1="$var1" \ 
    -v var2="$var2" \ 
    -v var3="$var3" \ 
    -v var4="$var4" \ 
    -v var5="$var5" \ 
'{ 
    for (m=1; m<=NF; m++) { 
     if ($m ~ var1 && $(m+1) ~ var2) { 
      print "ABCD: ", $(m+2),$(m+3),$(m+4) 
      flag=0 
     } 
     else { 
      if (flag == 0 && $m ~ var3) { 
       print "EFG : ", $(m+1) 
      } 
      else { 
       if (flag == 0 && $m ~ var4 && $(m+1) ~ var5) { 
        print "HIJ: ",$(m+2),$(m+3) 
        flag=1 
       } 
      } 
     } 
    } 
}' fliename 
+0

+1對於'whitespace是你的朋友 - 或者說它是下一個人的朋友必須維護你的代碼' –

+0

在for循環中,最大值是'NF-1'。如果寫非空信息非常重要,那麼'NR-4'。 – TrueY

+0

這是一個答案,或者你爲什麼不編輯這個問題? – mschilli

0

格倫的版本提高一點點。我否定了flag,因此可以跳過初始化。

var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR"; 
awk -v var1="$var1" -v var2="$var2" -v var3="$var3" -v var4="$var4" -v var5="$var5" \ 
'!flag { 
    for (m=1; m<=NF-1; ++m) 
     if ($m == var1 && $(m+1) == var2) { 
      print "ABCD: ", $(m+2),$(m+3),$(m+4) 
      flag=1 
      next 
     } 
} 
flag { 
    for (m=1; m<=NF-1; ++m) 
     if ($m == var3) { 
      print "EFG : ", $(m+1) 
      break 
     } else { 
      if ($m == var4 && $(m+1) == var5) { 
       print "HIJ: ",$(m+2),$(m+3) 
       flag=0 
       break 
      } 
     } 
}' filename 

輸出:

ABCD: A B C 
EFG : EFG 
HIJ: J K 
ABCD: E H G 
EFG : EFG 
HIJ: J K 

或者你甚至可以嘗試純bash的版本:

var1="LLL";var2="SSS";var3="TTT";var4="AAA";var5="RRR"; 

found=0; 
while read -a a; do 
    if [ $found -eq 0 ]; then 
    for((i=0;((i+1))<${#a[*]};++i)) { 
     [ ${a[$i]} == $var1 -a ${a[((i+1))]} == $var2 ] && 
     echo ABCD: ${a[((i+2))]} ${a[((i+3))]} ${a[((i+4))]} && 
     found=1 && break 
    } 
    else 
    for((i=0;((i+1))<${#a[*]};++i)) { 
     [ ${a[$i]} == $var3 ] && echo EFG: ${a[((i+1))]} && break 
     [ ${a[$i]} == $var4 -a ${a[((i+1))]} == $var5 ] && found=0 && 
     echo HIJ: ${a[((i+2))]} ${a[((i+3))]} && break 
    } 
    fi 
done <filename 
+0

@ user2428250:我添加了一個純粹的'bash'解決方案。 – TrueY