Удалить буквы и точки из всех строк

У меня есть CSV, который имеет вывод time команд различных программ, включая идентификатор выполнения.

Поэтому мои файлы содержат записи в следующей форме:

ID,execution_time

Пример записи:

345,0m0.047s

Мне нужны только количество выполнений и количество секунд.

Поэтому вышеупомянутая запись должна быть

345,0047 (без "0m", "." И "s").

Можно ли этого достичь?

4
задан 3 July 2014 в 01:32

5 ответов

Вот мое решение:

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
5
ответ дан 3 July 2014 в 01:32

Это должно быть:

sed 's/m0\.\(.*\)s$/\1/g'

4
ответ дан 3 July 2014 в 01:32

Другой через 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
1
ответ дан 3 July 2014 в 01:32

Что, если существуют минуты, а? Вот тот, который значит это, преобразовывая их в секунды:

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
10
ответ дан 3 July 2014 в 01:32

ответ использования @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, мы знаем?))

1
ответ дан 3 July 2014 в 01:32

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

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