добавить символы каждые два места в седе - PullRequest
1 голос
/ 07 апреля 2020

Я работаю с CSV-файлами, они извлекают из базы данных каталоги c, мне нужно расположить их в формате USGS, чтобы начать другие шаги.

Мой формат входных данных:

DatesT,Latitude,Longitude,Magnitude,Depth,Catalog
1909,7,23,170000,-17.430,-66.349,5.1,0,PRE-GEM-ISC
1913,12,14,024500,-17.780,-63.170,5.6,0,PRE-GEM-ISC

Формат ввода USGS:

DatesT,Latitude,Longitude,Magnitude,Depth,Catalog
1909-7-23T17:00:00,-17.430,-66.349,5.1,0,PRE-GEM-ISC
1913-12-14T02:45:00,-17.780,-63.170,5.6,0,PRE-GEM-ISC

Чтобы «преобразовать» мой ввод в формат USGS, я сделал следующие шаги:

archi='catalog.txt'
sed 's/,/-/1' $archi > temp1.dat   # to change "," to "-" 
sed 's/,/-/1' temp1.dat > temp2.dat  # same as above
sed 's/,/T/1' temp2.dat > temp3.dat   # To add T between date and time
sed -i.bak "1 s/^.*$/DatesT,Latitude,Longitude,Magnitude,Depth,Catalog/" temp3.dat  #to preserve the header.

У меня есть следующий вывод:

DatesT,Latitude,Longitude,Magnitude,Depth,Catalog
1909-7-23T170000,-17.430,-66.349,5.1,0,PRE-GEM-ISC
1913-12-14T024500,-17.780,-63.170,5.6,0,PRE-GEM-ISC

Я попытался реализовать следующую команду:

sed 's/.\{13\}/&: /g' temp3.dat > temp4.dat

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

Есть ли у вас идеи улучшить мой код.

Будьте в безопасности

Тонино

Ответы [ 3 ]

2 голосов
/ 07 апреля 2020

В одну сторону, используя GNU sed:

sed -r 's/([0-9]{4}),([0-9]{1,2}),([0-9]{1,2}),([0-9]{2})([0-9]{2})([0-9]{2})(,.*)/\1-\2-\3T\4:\5:\6\7/'  file

Вы разбиваете файл на отдельные токены, то есть столбец как токен один, 2-й столбец как токен 2, а когда дело доходит до 4-го столбца, принимайте 2 числа как токен, а затем замените его при необходимости.

1 голос
/ 07 апреля 2020

Это может работать для вас (GNU sed):

sed -E  '1!s/^([^,]*),([^,]*),([^,]*),(..)(..)/\1-\2-\3T\4:\5:/' file

Забудьте о заголовке.

Замените первый и второй разделители полей (все поля разделяются запятой ,) с да sh -.

Замените разделитель третьих полей на T.

Разделите четвертое поле на три равные части и разделите каждую часть двоеточием :.

NB. Последняя часть четвертого поля останется как есть и поэтому ее не нужно определять.

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

1 голос
/ 07 апреля 2020

Вы можете сделать:

cat initialfile.csv|perl -p -e "s/^(\d{4}),(\d+),(\d+),(\d{2})(\d{2})(\d{2}),([0-9.-]+),([0-9.-]+),(.*)$/\1-\2-\3T\4:\5:\6,\7,\8,\9/g"

или для встроенного редактирования:

perl -p -i -e "s/^(\d{4}),(\d+),(\d+),(\d{2})(\d{2})(\d{2}),([0-9.-]+),([0-9.-]+),(.*)$/\1-\2-\3T\4:\5:\6,\7,\8,\9/g" initialfile.csv

, которые должны выводить формат USGS

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