awk 'BEGIN {
...
}
# the next line should NOT be within curly braces
$1 ~ /^Observation/, $1 ~ /^@@@/ { ... }
{
...
}
END{
...
}' input.txt > out.csv
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.
awk 'BEGIN {
...
}
# the next line should NOT be within curly braces
$1 ~ /^Observation/, $1 ~ /^@@@/ { ... }
{
...
}
END{
...
}' input.txt > out.csv
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$