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.
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 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
.