sed - preserva a nova linha ao gravar em um novo arquivo

0

Eu tenho arquivos contendo dados. Esses dados, às vezes, contêm artefatos dos quais preciso se livrar. Uma linha de exemplo é assim:

@@@@@@@@@@DK2018.4.24_0:0:0.200985,0.88,0.35,0.49,13.52,248.3

Ou assim:

17.9.12_0:0:0.152507,0.02,0.82,0.10,11.76,181.8
17.9.12_0:0:0.554122,0.18,0.93,0.04,11.76,191.1
17.9.12_0:0:0.654682,0.06,0.89,0.10,11.74,184.0
17.9.12_0:0:0.755092,0.00,0.89,0.06,11.77,180.5
17.9.12_0:0:0.855754,0.02,0.87,0.09,11.76,181.4
17.9.12_0:0:0.955123,0.13,0.80,0.23,11.77,189.8
17.9.12_0:0:1.055499,0.10,0.82,0.35,11.76,187.6
17.9.12_0:0:1.155970,0.18,0.81,0.40,11.74,192.9
17.9.12_0:0:1.256581,0.15,0.91,0.44,11.74,189.3
17.9.12_0:0:1.356065,0.26,0.78,0.46,11.72,198.7
17.9.12_0:0:1.456712,0.37,0.69,0.33,11.74,208.1

Em ambos os casos, alguns caracteres indesejados estão na frente da string de data. Eu preciso removê-los e manter todo o resto. Às vezes, esses artefatos não estão na coluna de datas, mas em uma das outras colunas.

O que tentei é usar sed assim:

sed 's/[^0-9:_.,]*//g' dat.log > test.log

O objetivo era apagar tudo, exceto números, pontos-e-vírgulas, sublinhados, pontos e vírgulas. E isso funciona muito bem. O problema é que o sed não escreve de volta a nova linha. Eu sei que isso acontece durante o processo, mas como posso recuperá-lo quando a linha é gravada em um arquivo?

edit: Adicionadas mais linhas à entrada de exemplo e à saída adicionada do meu comando sed:

2017.9.12_0:0:0.051920,0.03,0.74,0.09,11.72,182.72017.9.12_0:0:0.152507,0.02,0.82,0.10,11.76,181.82017.9.12_0:0:0.253551,0.00,0.89,0.04,11.77,180.52017.9.12_0:0:0.353267,0.04,0.96,0.02,11.77,182.72017.9.12_0:0:0.453707,0.15,0.95,0.02,11.71,189.32017.9.12_0:0:0.554122,0.18,0.93,0.04,11.76,191.12017.9.12_0:0:0.654682,0.06,0.89,0.10,11.74,184.02017.9.12_0:0:0.755092,0.00,0.89,0.06,11.77,180.52017.9.12_0:0:0.855754,0.02,0.87,0.09,11.76,181.42017.9.12_0:0:0.955123,0.13,0.80,0.23,11.77,189.82017.9.12_0:0:1.055499,0.10,0.82,0.35,11.76,187.62017.9.12_0:0:1.155970,0.18,0.81,0.40,11.74,192.92017.9.12_0:0:1.256581,0.15,0.91,0.44,11.74,189.32017.9.12_0:0:1.356065,0.26,0.78,0.46,11.72,198.72017.9.12_0:0:1.456712,0.37,0.69,0.33,11.74,208.1

edit2: O problema é que o Raspberry Pi de onde vêm os dados salvou os arquivos com o conjunto de dados do macintosh. Não faço ideia do porquê, mas mudar isso usando tr '\r' '\n' < macfile.txt > unixfile.txt primeiro resolveu o problema.

    
por BallerNacken 09.08.2018 / 10:01

2 respostas

0

Aqui parece que você pode fazer:

tr -cd '0-9:_.,\r\n' < file.in > file.out

Para remover todos os caracteres, exceto os que você deseja manter, incluindo os delimitadores de linha em qualquer formato inicialmente.

    
por 09.08.2018 / 11:22
0

Por que você não se livra do tr e inclui isso no comando sed :

sed 's/\(^\|^M\)[^0-9:_.,]*/\n/g; s/^\n//' file

Pode ser um pouco complicado incluir os caracteres de controle (^ M, \ r, 0x0D) e (\ n, 0x0A) no script sed , dependendo do sistema operacional e da versão sed .

    
por 09.08.2018 / 11:08

Tags