2011-11-29 50 views
2

如何在自包含的awk腳本中使用awk範圍模式'/begin regex/,/end regex/'腳本中的awk'/ range start /,/ range end /'

爲了澄清,給定的程序csv.awk:

#!/usr/bin/awk -f 

BEGIN { 
FS = "\"" 
} 

/TREE/,/^$/ 
{ 
    line=""; 
     for (i=1; i<=NF; i++) { 
       if (i != 2) line=line $i; 
     } 

     split(line, v, ","); 
     if (v[5] ~ "FOAM") { 
       print NR, v[5]; 
     } 
} 

和文件塊:

TREE 
10362900,A,INSTL - SEAL,Revise 
,10362901,A,ASSY/DETAIL - PANEL,Revise 
,,-203,ASSY - PANEL,Qty -,Add 
,,,-309,PANEL,Qty 1,Add 
,,,,"FABRICATE FROM TEKLAM NE1G1-02-250 PER TPS-CN-500, TYPE A" 
,,,-311,PANEL,Qty 1,Add 
,,,,"FABRICATE FROM TEKLAM NE1G1-02-750 PER TPS-CN-500, TYPE A" 
,,,-313,FOAM SEAL,1.00 X 20.21 X .50 THK,Qty 1,Add 
,,,,"BMS1-68, GRADE B, FORM II, COLOR BAC706 (BLACK)" 
,,,-315,FOAM SEAL,1.50 X 8.00 X .25 THK,Qty 1,Add 
,,,,"BMS1-68, GRADE B, FORM II, COLOR BAC706 (BLACK)" 
,PN HERE,Dual Lock,Add 
, 
10442900,IR,INSTL - SEAL,Update (not released) 
,10362901,A,ASSY/DETAIL - PANEL,Revise 
,PN HERE,Dual Lock,Add 

我想有這樣的輸出:

27 FOAM SEAL 
29 FOAM SEAL 

什麼是語法將命令行形式'/begin regex/,/end regex/'添加到腳本以僅在這些行上操作?我所有的嘗試都會導致語法錯誤,Google搜索只會給我提供cli的形式。

回答

1

簡單地做:

#!/usr/bin/awk -f 

BEGIN { 
FS = "\"" 
} 

/from/,/to/ { 
    line=""; 
     for (i=1; i<=NF; i++) { 
       if (i != 2) line=line $i; 
     } 

     split(line, v, ","); 
     if (v[5] ~ "FOAM") { 
       print NR, v[5]; 
     } 
} 

如果fromto正則表達式是動態的:

#!/usr/bin/awk -f 

BEGIN { 
    FS = "\"" 
    FROM=ARGV[1] 
    TO=ARGV[2] 
    if (ARGC == 4) { # the pattern was the only thing, so force read from standard input     
     ARGV[1] = "-" 
    } else { 
     ARGV[1] = ARGV[3] 
    } 
} 

{ if ($0 ~ FROM) { p = 1 ; l = 0} } 
{ if ($0 ~ TO) { p = 0 ; l = 1} } 

{ 
    if (p == 1 || l == 1) { 
    line=""; 
     for (i=1; i<=NF; i++) { 
       if (i != 2) line=line $i; 
     } 

     split(line, v, ","); 
     if (v[5] ~ "FOAM") { 
       print NR, v[5]; 
     } 
    l = 0 } 
} 

現在,你必須把它想:./scriptname.awk "FROM_REGEX" "TO_REGEX" INPUTFILE。最後一個參數是可選的,如果缺少STDIN可以使用。

HTH

+0

現在使「從」和「到」動態,OP想要從命令行饋送。 – akira

+0

我很抱歉,那裏提到了哪裏?無論如何,編輯解決方案。 –

+0

只是爲了改變'from'和'to'的範圍而改變腳本將是一件可悲的事情,不是嗎? :) – akira

4

爲什麼不使用兩個步驟:

% awk '/start/,/end/' < input.csv | awk csv.awk 
+3

因爲沒有必要。 –

0

您需要向我們展示你已經嘗試了什麼。是否有一些關於/正則表達式開頭/或/結束正則表達式/你不告訴我們,其他明智的用加你的腳本應該工作,即

#!/usr/bin/awk -f 

BEGIN { 
FS = "\"" 
} 

/begin regex/,/end regex/{ 
    line=""; 
     for (i=1; i<=NF; i++) { 
       if (i != 2) line=line $i; 
     } 

     split(line, v, ","); 
     if (v[5] ~ "FOAM") { 
       print NR, v[5]; 
     } 
} 

或者你使用的是舊的Unix,那裏是老awk作爲/ usr/bin/awk和新的awk作爲/ usr/bin/nawk。另請參閱/ usr/xpg4/bin/awk或gawk(路徑可能是任何內容)。

最後,讓我們看看您收到的錯誤消息。

我希望這會有所幫助。