awk '/ начало диапазона /, / конец диапазона /' внутри скрипта - PullRequest
2 голосов
/ 30 ноября 2011

Как использовать шаблон диапазона awk '/begin regex/,/end regex/' в автономном скрипте awk?

Чтобы уточнить, для данной программы 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 дает мне только форму.

Ответы [ 3 ]

4 голосов
/ 30 ноября 2011

почему бы не использовать 2 шага:

% awk '/start/,/end/' < input.csv | awk csv.awk
1 голос
/ 30 ноября 2011

Просто сделайте:

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

НТН

0 голосов
/ 30 ноября 2011

Вы должны показать нам, что вы пытались.Есть ли что-то о / begin regex / или / end regex / вы не говорите нам, в противном случае ваш скрипт с дополнениями должен работать, т.е.

#!/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 (путь может быть любым).

Наконец, покажите нам сообщения об ошибках, которые вы получаете.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...