Como converter string em int no arquivo csv?

1

Eu tenho um arquivo fb.csv como abaixo;

"Source","Destination","Time"  
"192.168.137.174","157.240.10.18","12:26:25.782658000"
"10.0.138.163","157.240.10.18","12:26:25.782766000"
"157.240.10.13","192.168.137.174","12:26:36.488264000"
"157.240.10.13","10.0.138.163","12:26:36.488178000"
"157.240.10.23","192.168.137.174","12:26:41.808511000"
"157.240.10.23","10.0.138.163","12:26:41.808440000"
"10.0.138.163","157.240.10.18","12:26:52.275093000"
"192.168.137.174","157.240.10.18","12:26:52.275025000"

O tempo (na coluna 3) é uma string e eu gostaria de convertê-lo em um inteiro, como eu gostaria de prosseguir com uma operação para encontrar a duração. E também quero excluir todos os números depois de "." na coluna do tempo.

Saída desejada:

"Source","Destination","Time"  
"192.168.137.174","157.240.10.18","12:26:25"
"10.0.138.163","157.240.10.18","12:26:25"
"157.240.10.13","192.168.137.174","12:26:36"
"157.240.10.13","10.0.138.163","12:26:36"
"157.240.10.23","192.168.137.174","12:26:41"
"157.240.10.23","10.0.138.163","12:26:41"
"10.0.138.163","157.240.10.18","12:26:52"
"192.168.137.174","157.240.10.18","12:26:52"

Existe algum método ou função que eu possa usar para fazer isso?

    
por Ayu 14.09.2017 / 19:20

3 respostas

2

Podemos usar sed desta maneira:

sed -E 's/\:([0-9])([0-9])\..*"/\:"/g' fb.csv

Melhor expressão regular foi fornecida por @GlennJackman:

  

Um cólon não é especial e não precisa ser escapado. Você não precisa   para capturar cada dígito separadamente. Não precisa ser global   substituição porque o primeiro irá apagar o resto da linha:    s/(:[0-9][0-9])\.[0-9]+// :

sed -E 's/(:[0-9][0-9])\.[0-9]+//' fb.csv

A solução mais leves sem regex estendido foi fornecida pela @Dessert:

sed 's/\.[0-9]*"$/"/' fb.csv

Para converter a terceira coluna em integer , se bem entendi, devemos adicionar a segunda expressão:

sed -e 's/\.[0-9]*"$/"/' -e 's/\://g' fb.csv

Se a saída parece adequada, podemos adicionar a opção -i.bak para substituir os valores em seus lugares e criar um arquivo de backup simultaneamente:

sed -e 's/\.[0-9]*"$/"/' -e 's/\://g' fb.csv -i.bak

Referências:

por pa4080 14.09.2017 / 20:02
1

Usando sed:

sed -E 's/(.*)"([0-9]*:[0-9]*:[0-9]*)\.[0-9]*"//' fb.csv

Livrar-se do : para que a última coluna possa ser operada:

sed -Ee 's/(.*)"([0-9]*:[0-9]*:[0-9]*)\.[0-9]*"//' -e 's/\://g' fb.csv
    
por George Udosen 14.09.2017 / 20:16
1

Use awk para remover qualquer coisa depois de um ponto no último campo.

awk -F\" '{gsub(/\..*$/, "", $(NF-1) )}1' OFS=\" infile

e use da seguinte maneira se você precisar fazer o cálculo da diferença entre duas vezes em linhas consecutivas em segundos.

awk -F\" 'function abs(x) {return x<0 ? -x : x} 
    { gsub(/\..*$/, "", $(NF-1) ) }
    NR>1{ split( $(NF-1), ary, /:/); t_sec= 3600*ary[1] + 60*ary[2] + ary[3];
          getline; N=$(NF-1); split( $N, ary, /:/); t_sec_N= 3600*ary[1] + 60*ary[2] + ary[3];
          print abs(t_sec - t_sec_N);
}' OFS=\" infile

função emprestada de @genn's answer

    
por αғsнιη 14.09.2017 / 20:07