O que torna esse problema de processamento de texto difícil ou incomum é que as colunas precisam ser processadas individualmente.
Isso é um pouco complicado, mas parece que funciona:
#!/bin/sh
rm -f newfile
for column in 1 2 3 4 5; do
cut -f "$column" file |
perl -ne 'chomp;$nl = ((tr /"/"/ % 2 == 0) ? "\n" : " "); print $_, $nl' |
sed -e 's/[[:blank:]]*$//' -e '/^[[:blank:]]*$/d' |
{ if [ -f newfile ]; then
paste newfile -
else
cat
fi
} >newfile.tmp
mv newfile.tmp newfile
done
O script presume que o arquivo de entrada é chamado file
e criará um arquivo chamado newfile
(e usando o nome de arquivo newfile.tmp
para dados temporários). Além disso, pressupõe que as colunas estão adequadamente delimitadas por tabulações.
Ele extrai as colunas delimitadas por tabulação, uma a uma, do arquivo original com cut
. Cada coluna individual é passada por um script Perl curto:
chomp;
$nl = ( ( tr /"/"/ % 2 == 0 ) ? "\n" : " " );
print $_, $nl;
Isso conta o número de aspas duplas em cada linha e emitirá a linha com uma nova linha anexada se a linha contiver um número par de aspas duplas. Se o número de aspas for ímpar, ele anexará um caractere de espaço no final da linha (mesclando, assim, cadeias de caracteres entre linhas que abrangem as linhas). Esta é uma maneira legal de fazer isso.
O sed
fará alguma limpeza, removendo o espaço em branco no final das linhas e excluindo linhas vazias.
Eu, então, paste
este novos dados como uma nova coluna delimitada por tabulações em newfile
(primeiro gerando para newfile.tmp
e renomeando esse arquivo). O cat
é executado apenas para a primeira coluna quando newfile
ainda não existe.
Com os dados de entrada fornecidos, supondo que as colunas estejam adequadamente delimitadas por tabulações, isso produzirá o seguinte arquivo delimitado por tabulações:
"column1" "column2" "column3" "column4" " column5"
"DATA" "THIS CONTAIN NEWLINE" "DATA" "THIS CONTAIN NEWLINE" "DATA"
Com as guias substituídas por símbolos de canal (para mostrar onde as colunas começam e terminam):
$ tr '\t' '|' <newfile
"column1"|"column2"|"column3"|"column4"|" column5"
"DATA"|"THIS CONTAIN NEWLINE"|"DATA"|"THIS CONTAIN NEWLINE"|"DATA"