Substitua as quebras de linha nas linhas correspondentes, usando o AWK

4

Eu tenho os seguintes dados

O que eu gostaria de fazer é para cada linha, onde não há, "555" no final, quero remover a quebra de linha \ n e substituí-la por espaço.

Assim, a "linha de correspondência" seria a linha sem o "555" no final. Eu gostaria de substituir a quebra de linha dessas linhas.

Eu sou limitado porque não posso usar o Perl para isso. Então, tem que ser AWK ou SED. Mas, de preferência, o AWK, como eu sei, o SED não é bom para trabalhar em várias linhas.

Aqui estão dois exemplos:

Exemplo 1

"abc","555"
"d
e
f","555"
"xyz","555"
"abc
d,e,f ghi
jkl
mnop,qrs","555"

Deve se tornar (após emenda)

"abc","555"
" d e f","555"
"xyz","555"
"abc d,e,f ghi jkl mnop,qrs","555"

& Exemplo 2

"abc","555"
"d
e
f","555"
"xyz","555"
"aa
bb
cc
dd","555"

Deve se tornar (após emenda)

"abc","555"
"d e f","555"
"xyz","555"
"aa bb cc dd","555"

Portanto, na saída necessária, na verdade, cada linha tem formato

"content","555"
    
por SuperUserMan 04.10.2014 / 01:02

2 respostas

4

O truque, nesse caso, não é pensar nisso como "trabalhar em várias linhas".

awk '/"555"$/ {print; next} {printf "%s ", $0}'

imprime cada linha que é a última linha de um grupo normalmente e depois diz next para ir para a próxima linha de entrada (não processando o comando restante). O comando restante, que se torna um caso padrão, imprime a linha atual, seguida por um espaço, sem uma nova linha. Isso também pode ser feito como

awk '{if ($0 ~ /"555"$/) print; else printf "%s ", $0}'
    
por 04.10.2014 / 02:40
1

Eu não estou familiarizado com o AWK, mas você poderia fazer isso em duas etapas, primeiro substituir "555" \ n por algo que você nunca encontrará em seu arquivo, como "55555555555555555 ######### ############################ 444444444444444444444444444 ". Em seguida, substitua todos os \ n com espaço

Posteriormente, substitua a string estranha por "555" \ n

    
por 04.10.2014 / 01:16