2013-05-28 61 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