Как преобразовать строку в INT в CSV-файл?

У меня есть файл fb.csv, как показано ниже;

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

Время (в столбце 3) является строкой, и я хотел бы преобразовать ее в целое число, как я хотел бы продолжить с операция, чтобы найти продолжительность. А также я хочу удалить все цифры после "." в столбце времени.

Желаемый результат:

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

Можно ли использовать какой-либо метод или функцию для этого?

1
задан 14 September 2017 в 20:23

3 ответа

Мы можем использовать sed следующим образом:

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

Лучшее регулярное выражение было предоставлено @GlennJackman:

Двоеточие не является специальным и не нуждается в быть сбежавшим Вам не нужно захватывать каждую цифру отдельно. Это не обязательно должна быть глобальная замена, потому что первая удалит остальную часть строки: s/(:[0-9][0-9])\.[0-9]+/\1/:

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

Наиболее легкое решение без расширенного регулярного выражения было предоставлено @Dessert :

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

Чтобы преобразовать третий столбец в целое число , если я правильно понимаю, мы должны добавить второе выражение:

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

Если выходные данные выглядят адекватно, мы можем добавить опцию -i.bak, чтобы заменить значения на их местах и ​​создать файл резервной копии одновременно:

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

Ссылки:

0
ответ дан 14 September 2017 в 20:23

Использование sed:

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

Избавление от :, чтобы можно было оперировать с последним столбцом:

sed -Ee 's/(.*)"([0-9]*:[0-9]*:[0-9]*)\.[0-9]*"/\1\2/' -e 's/\://g' fb.csv
0
ответ дан 14 September 2017 в 20:23

Использовать awk удалить что-либо после точки в последнем поле.

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

и использование в качестве после того, если необходимо сделать вычисление различия между двумя разами в последовательных строках в секундах.

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

функция заимствована из ответа @glenn

1
ответ дан 14 September 2017 в 20:23

Другие вопросы по тегам:

Похожие вопросы: