O que é o comando sed para corrigir este arquivo, então o último valor em cada linha é citado duas vezes

6

Eu tenho um arquivo contendo dois milhões de linhas do formulário:

"00005cea-668e-4475-9e19-92a25c8b74fb",129.24728",D#

o último valor deve ser:

"00005cea-668e-4475-9e19-92a25c8b74fb",129.24728,"D#"

Por favor, como eu uso o comando sed para corrigir este arquivo para que o falso "seja removido e o último valor seja duplicado entre aspas

    
por Paul Taylor 26.11.2015 / 11:14

3 respostas

5

Você poderia tentar algo como:

sed -r 's/",([^,]*)$/,""/' input-file

Isso é um ", seguido por qualquer coisa que não seja uma vírgula ( [^,] ) até o final do arquivo $ . é a parte correspondida entre parênteses - ([^,]*) .

    
por muru 26.11.2015 / 11:25
3

Não é sed , mas perl :

perl -F, -ane '($f1)=$F[1]=~/(.*)"/; $F[2]=~s/\n//g; print "$F[0],$f1,\"$F[2]\"\n";'

Explicação:

  • perl -F, -ane lê a linha de entrada e divide a linha em ,
  • ($f1)=$F[1]=~/(.*)"/; remove o " na segunda coluna
  • $F[2]=~s/\n//g; remove a nova linha no final
  • print "$F[0],$f1,\"$F[2]\"\n"; escreve a saída e adiciona o " ao último valor

Editar - versão reduzida (graças a @kos):

perl -F, -lane '$F[1]=~s/"$//; print "$F[0],$F[1],\"$F[2]\"";'
    
por Wayne_Yux 26.11.2015 / 11:43
3

Parece que seus campos são definidos por vírgulas. Se assim for, você pode fazer isso em sed :

sed -i -r 's/",([^,]*)$/,""/' file

Ou, em Perl:

perl  -i -lpe 's/",([^,]*)$/,""/' file

Em ambos os casos, o regex simplesmente procura uma vírgula e, em seguida, 0 ou mais não-vírgulas até o final da linha. Os parênteses capturam os últimos campos aos quais podemos nos referir como (ou em perl). Este é então substituído por si mesmo entre aspas duplas. O -i é para editar o arquivo no lugar, as alterações são feitas no arquivo original.

Você também pode usar awk :

awk -F, -vOFS=, '{sub(/"/,"",$(NF-1)); $NF="\""$NF"\""}1;' file

Ou, se sua versão for compatível:

awk -iinplace -F, -vOFS=, '{sub(/"/,"",$(NF-1)); $NF="\""$NF"\""}1;' file 
    
por terdon 26.11.2015 / 12:04