Por que o awk diz “erro de sintaxe” para a vírgula que coloquei entre os dois padrões?

3

Eu corro o seguinte script no Linux (Mint em uma chave USB) com o GNU Awk 4.0.1 instalado por padrão.

O erro retornado pelo awk é o seguinte:

awk: cmd. line:7:               /^Observation/,/^@@@/ {sub("/^N° of case: \(.*\)$","\1\$"); print}
awk: cmd. line:7:                             ^ syntax error

O script é o seguinte (com "..." substituindo algumas linhas de código não relevantes que removi aqui):

#!/bin/bash

...

awk 'BEGIN \
    {
        FS = "@@@\n"; RS = "###-###\n"; OFS = "$"; ORS = "\n"; SUBSEP = ","
        printf("CaseNum$Department$Topic\n");
    }
    {
        # Body awk script
        /^Observation/,/^@@@/ {sub("/^N° of case: \(.*\)$","\1\$"); print}
        /^Observation/,/^@@@/ {sub("/^Department: \(.*\)$","\1\$"); print}
        /^Observation/,/^@@@/ {sub("/^Topic: \(.*\)$","\1\$"); print}
    }
    END \
    {
        #printf("Number of records processed : %d",NR);
    }' input.txt > out.csv

FYI, o arquivo input.txt que é analisado pelo script é como o seguinte (com o "Blabla" que pode ser qualquer coisa e ter qualquer comprimento).

...
Observation
Blabla
N° of case: ZX56734562
Blabla
Department: 56
Blabla
Topic: ER
Blabla
@@@
Blabla
@@@
Blabla
###-###
Observation
Blabla
N° of case: RF34678432
Blabla
Topic: TYG
Blabla
@@@
Blabla
...

Por favor, note que alguns campos podem estar faltando, mas o arquivo out.csv deve manter quaisquer campos, mesmo aqueles omitidos (por exemplo: aqui está faltando o campo "Departamento" do segundo registro e o out.csv tem um caso em branco)

E eu quero obter o seguinte out.csv (formato csv com cabeçalho na primeira linha):

CaseNum$Department$Topic
ZX56734562$56$ER
RF34678432$$TYG

Eu sei como fazer isso com o sed mas eu quero usar o awk. Além disso, quero manter minha estrutura de código (várias linhas em vez de 1 linha de código condensado, blocos BEGIN e END e o filtro de dois padrões para evitar campos inválidos que podem ser encontrados em "Blabla").

Obrigado antecipadamente.

    
por Syl87 01.09.2015 / 10:33

2 respostas

3

awk 'BEGIN {
        ...
     }
     # the next line should NOT be within curly braces
     $1 ~ /^Observation/, $1 ~ /^@@@/ { ... }
     {
        ...
     }
     END{
        ...
     }' input.txt > out.csv
    
por 01.09.2015 / 10:56
0

Não está claro o que você quer exatamente alcançar, mas aqui está uma versão simplificada que pode atender às suas necessidades:

awk '
BEGIN { ORS = "$" }
/^N° du cas:/,/^@@@/ {
    sub("N° du cas: ","\n")
    if($1!="@@@")
        print
}
{ next }
END {
    printf("\n")
    printf("Number of records processed : %d",NR)
}'

Com sua entrada de exemplo, sua saída é:

ZX56734562$Blabla$
RF34678432$Blabla$
    
por 01.09.2015 / 11:23

Tags