脚本中的awk'/ range start /,/ range end /'

时间:2011-11-29 20:54:47

标签: awk

如何在自包含的awk脚本中使用awk范围模式'/begin regex/,/end regex/'

澄清一下,给定程序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/'添加到脚本以仅对这些行进行操作的语法是什么?我所有的尝试都会导致语法错误,谷歌搜索只会给我一个cli形式。

3 个答案:

答案 0 :(得分:4)

为什么不使用两个步骤:

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

答案 1 :(得分: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];
        }
}

如果from to正则表达式是动态的:

#!/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

答案 2 :(得分: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,New awk为/ usr / bin / nawk。另外看看你是否有/ usr / xpg4 / bin / awk或gawk(路径可以是任何东西)。

最后,向我们展示您收到的错误消息。

我希望这会有所帮助。