У меня есть файл 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"
Можно ли использовать какой-либо метод или функцию для этого?
Мы можем использовать sed
следующим образом:
sed -E 's/\:([0-9])([0-9])\..*"/\:\1\2"/g' fb.csv
Лучшее регулярное выражение было предоставлено @GlennJackman:
Двоеточие не является специальным и не нуждается в быть сбежавшим Вам не нужно захватывать каждую цифру отдельно. Это не обязательно должна быть глобальная замена, потому что первая удалит остальную часть строки:
blockquote>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
Ссылки:
Использование 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
Использовать 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