У меня есть CSV, который имеет вывод time
команд различных программ, включая идентификатор выполнения.
Поэтому мои файлы содержат записи в следующей форме:
ID,execution_time
Пример записи:
345,0m0.047s
Мне нужны только количество выполнений и количество секунд.
Поэтому вышеупомянутая запись должна быть
345,0047
(без "0m", "." И "s").
Можно ли этого достичь?
Вот мое решение:
sed -i 's/[0-9]*m\|s\|\.//g' file.csv
можно хотеть пропустить первую строку, в случае, если она содержит заголовок, как это:
sed -i '2,$s/[0-9]*m\|s\|\.//g' file.csv
Примечание, что -i
причины опции sed
для работы "на месте", изменяя исходный файл. Если Вы хотите создать новый файл вместо этого, используйте это:
sed 's/[0-9]*m\|s\|\.//g' file.csv > new_file.csv
Другой через awk,
awk -F, -v OFS="," '{gsub(/0m/,"",$2);gsub(/\./,"",$2);gsub(/s/,"",$2); print $1,$2}' file
Пример:
$ echo '345,0m0.047s' | awk -F, -v OFS="," '{gsub(/0m/,"",$2);gsub(/\./,"",$2);gsub(/s/,"",$2); print $1,$2}'
345,0047
И соответствующий,
$ echo '345,52m0.047s' | awk -F, -v OFS="," '{gsub(/^.*?m/,"",$2);gsub(/\./,"",$2);gsub(/s/,"",$2); print $1,$2}'
345,0047
Что, если существуют минуты, а? Вот тот, который значит это, преобразовывая их в секунды:
awk -F'[m,]' '{print $1 "," $2*60 + $3}' file.csv
И несколько демонстраций:
$ ... <(echo -e "345,0m0.047s\n345,1m0.047s\n345,1m2.047s")
345,0.047
345,60.047
345,62.047
Я не уверен, почему Вы когда-либо хотели бы удалить десятичную точку, но можно передать вывод через sed 's/\.//g'
если Вам действительно нужно это:
$ ... <(echo -e "345,0m0.047s\n345,1m0.047s\n345,1m2.047s") | sed 's/\.//g'
345,0047
345,60047
345,62047
Eugh.
И — принятие этого является a time
вывод — что, если значение содержит часы или даже дни? Я играл вокруг немного и придумал этот небольшой выдающийся экземпляр:
awk -F'[dhms,]' 'BEGIN{split("1 60 3600 86400", T, " ")}{t=0; for (i=NF-1; i>1; i--) t+=T[NF-i]*$i; printf("%s,%.3f\n", $1, t)}'
Это обработает следующие форматы: *s
*m*s
*h*m*s
и *d*h*m*s
и преобразуйте их всех в секунды (к трем десятичным разрядам). Обязательное демонстрационное время:
$ ... <(echo -e "345,1.2s\n345,12m5s\n345,1h2m5s\n345,1d2h1m2.047s")
345,1.200
345,725.000
345,3725.000
345,93662.047
ответ использования @kraxor sed
, чтобы удалить "все остальное" из строки, и затем просто показать строку.
, Но - что на самом деле "все остальное" ? Здесь у нас есть идея, по крайней мере, от одной демонстрационной строки. Но что, когда мы получаем строку заголовка CSV? Что удалить?
В целом, мы не знаем.
Поэтому лучше на самом деле , показывают данные, которые мы хотим показать !
echo '345,0m0.047s' |
sed -n -r 's/^(.*),.*[^0-9]([0-9]*)\.(.*)s$/\1,\2\3/p'
345,0047
Работы до сих пор!
, Что это делает?
Мы обычно не печатаем строку (-n
)
(и активируемся, более хорошие "расширенные регулярные выражения" (-r
)) теперь ищут идентификатор, во-вторых, и долю секунды,
и если мы нашли их, поместили их в строку, в правильном формате (добавление""),
, и распечатайте недавно созданную строку.
Теперь [приблизительно 1 136] другой вход, довольно нормальный , с двумя строками данных:
ID,execution_time
123, Oops a comment0m0.0333s
345,0m0.047s
Ха?! Похож данные реального мира , на самом деле!
echo "ID,execution_time\n123, Oops a comment0m0.0333s\n345,0m0.047s" |
sed -r -n 's/^(.*),.*[^0-9]([0-9]*)\.(.*)s$/\1,\2\3/p'
123,00333
345,0047
хорошие Взгляды и просто правильные!
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
хорошо, фактические строки достоверных данных прошли приятно;
, Но другие части, не так (отмечают, заголовок был только передан, но отключен.).
(Примечание там решение состоит в том, чтобы явно пропустить строку заголовка (или возможно строка First Data, мы знаем?))