Como remover o caractere de nova linha dentro de uma coluna em um arquivo tsv?

1

Eupreciso"Isso contém nova linha" em uma linha, a nova linha da coluna2 e a coluna4 precisam ser removidas.

Nota: Para sua compreensão, os dados que eu enviar uma imagem, se você quiser, vou fazer o upload do conteúdo de texto

"column1"   "column2"          "column3"    "column4"           " column5"
"DATA"       "THIS                 "DATA"   "THIS                "DATA"
             CONTAIN NEWLINE"                 CONTAIN NEWLINE"

I need to remove the newline and output looks like:
"column1"   "column2"                "column3"  "column4"                " column5"
"DATA"      "THIS CONTAIN NEWLINE"    "DATA"    "THIS CONTAIN NEWLINE"     "DATA"
    
por Code explore 04.04.2018 / 15:04

1 resposta

0

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"
    
por 06.04.2018 / 12:02