Ignorando delimitadores escapados (vírgulas) com AWK?
Pergunta
Se eu tivesse uma corda com vírgulas escapadas como sim:
a,b,{c\,d\,e},f,g
Como posso usar o AWK para analisar isso nos seguintes itens?
a
b
{c\,d\,e}
f
g
Solução
{
split($0, a, /,/)
j=1
for(i=1; i<=length(a); ++i) {
if(match(b[j], /\\$/)) {
b[j]=b[j] "," a[i]
} else {
b[++j] = a[i]
}
}
for(k=2; k<=length(b); ++k) {
print b[k]
}
}
- Dividido em matriz
a
, usando ',
'Como delimitador - Construir matriz
b
a partir dea
, mesclando linhas que terminam em '\
' - Array de impressão
b
(Nota: começa em 2, já que o primeiro item está em branco)
Esta solução presume (por enquanto) que ',
'é o único personagem que já está escape com'\
'-isto é, não há necessidade de lidar com nenhum \\
na entrada, nem combinações estranhas, como \\\,\\,\\\\,,\,
.
Outras dicas
{
gsub("\\\\,", "!Q!")
n = split($0, a, ",")
for (i = 1; i <= n; ++i) {
gsub("!Q!", "\\,", a[i])
print a[i]
}
}
Eu não acho que a Awk tenha algum suporte interno para algo assim. Aqui está uma solução que não é tão curta quanto a de DigitalRoss, mas não deve ter perigo de acidentalmente acidentalmente acidentalmente sua corda inventada (! P!). Já que testa com um if
, você também pode estendê -lo para ter cuidado se você realmente tem \\,
No final da sua corda, que deve ser uma barra escapada, não vírgula.
BEGIN {
FS = ","
}
{
curfield=1
for (i=1; i<=NF; i++) {
if (substr($i,length($i)) == "\\") {
fields[curfield] = fields[curfield] substr($i,1,length($i)-1) FS
} else {
fields[curfield] = fields[curfield] $i
curfield++
}
}
nf = curfield - 1
for (i=1; i<=nf; i++) {
printf("%d: %s ",i,fields[i])
}
printf("\n")
}