A resposta de @kraxor usa sed
para remover "todo o resto" da linha e, em seguida, mostra a linha.
Mas - o que é realmente "todo o resto" ? Aqui temos uma ideia, pelo menos, de uma linha de amostra. Mas o que quando recebemos uma linha de cabeçalho CSV? O que remover?
Em geral, não sabemos.
Portanto, é melhor realmente mostrar os dados que queremos mostrar !
echo '345,0m0.047s' |
sed -n -r 's/^(.*),.*[^0-9]([0-9]*)\.(.*)s$/,/p'
345,0047
Funciona até agora!
O que isso faz?
Nós não imprimimos a linha normalmente ( -n
)
(e ative as "expressões regulares estendidas" mais agradáveis ( -r
))
Agora, procure o ID, segundo e segundo fracionário,
e se os encontramos, coloque-os na linha, no formato correto (adicionando ","),
e imprima a linha recém criada.
Agora, algumas outras entradas, bastante normais , com duas linhas de dados:
ID,execution_time
123, Oops a comment0m0.0333s
345,0m0.047s
Huh ?! Parece com dados do mundo real , na verdade!
echo "ID,execution_time\n123, Oops a comment0m0.0333s\n345,0m0.047s" |
sed -r -n 's/^(.*),.*[^0-9]([0-9]*)\.(.*)s$/,/p'
123,00333
345,0047
Parece legal e está certo!
Para mostrar que tem algum mérito de fazer isso, compararei com a resposta anterior:
echo "ID,execution_time\n123, Oops a comment0m0.0333s\n345,0m0.047s" |
sed 's/[0-9]*m\|s\|\.//g'
ID,execution_tie
123, Oop a coent00333
345,0047
Ok, as linhas de dados limpas e reais passaram bem;
Mas as outras partes, não tanto (note o cabeçalho não foi apenas passado, mas cortado.).
(Note que há uma solução para ignorar explicitamente a linha de cabeçalho (ou talvez a primeira linha de dados, sabemos?))