У меня есть файл csv ввода. На самом деле мне нужно выбрать значения 2-го и 3-го столбцов во входном файле и вам необходимо преобразовать зону часового пояса обоих значений (от PT до CT). После преобразования мне нужно заменить преобразованные значения часовых поясов в файл.Unix-скрипт - Нуждаются предложения по повышению производительности (сценарий оболочки)
Примечание: Все значения входных данных находятся в тихоокеанском часовом поясе, и я перехожу в центральный часовой пояс.
Каждая строка состоит из 5 столбцов - разделенный запятыми файл
CHID-123456323,2017-01-09 17:17:58-08:00,2017-01-09 17:39:25-08:00,hello,123456733
CHID-123456733,2017-01-09 17:16:58-08:00,2017-01-09 18:04:09-08:00,hello,123456734
CHID-123433589,2017-01-09 17:16:55-08:00,2017-01-09 17:40:29-08:00,hello,123456735
CHID-123000789,2017-01-09 17:16:52-08:00,2017-01-09 17:46:41-08:00,hello,123456736
Сценарий: я написал ниже сценарий, это дает точный результат, что я ожидал. Но при увеличении количества входных записей требуется больше времени. Например, 20 тысяч записей занимает 1 час 15 минут.
может ли кто-нибудь посмотреть этот скрипт и предложить, как улучшить производительность?
Сценарий:
while read i
do
var1=`echo $i | awk -F',' '{ print $2 }'`
var1_EPOCH=`date --date="${var1}" +%s`
var1_CTZ=`TZ=":America/Chicago" date +"%Y-%m-%d %T" [email protected]$var1_EPOCH`
sed -i "${cnt}s/${var1}/${var1_CTZ}/" filename
var2=`echo $i | awk -F',' '{ print $3 }'`
var2_EPOCH=`date --date="${var2}" +%s`
var2_CTZ=`TZ=":America/Chicago" date +"%Y-%m-%d %T" [email protected]$var2_EPOCH`
sed -i "${cnt}s/${var2}/${var2_CTZ}/" filename
cnt=$(($cnt+1))
done < filename
здесь является ожидаемым из положить файл
Окончательных выходной файл:
CHID-123456323,2017-01-09 19:17:58,2017-01-09 19:39:25,hello,123456733
CHID-123456733,2017-01-09 19:16:58,2017-01-09 20:04:09,hello,123456734
CHID-123433589,2017-01-09 19:16:55,2017-01-09 19:40:29,hello,123456735
CHID-123000789,2017-01-09 19:16:52,2017-01-09 19:46:41,hello,123456736
Не используйте awk для разграничения строки: используйте функции строковой строки $ {i # *,} и $ {%} (которая является нотарией bash) для извлечения дат. Вместо того, чтобы запускать sed дважды, объедините две подстановки в одну: s/D1/D2/g; s/D3/D4/g. Кроме того, время начала два раза в строке немного тяжело, PT и CT переключаются в летнее время в тот же день, поэтому разница во времени всегда одинакова. – user1666959
Это, вероятно, будет намного быстрее, если вы перепишете его на Perl, просто потому, что вы не будете запускать 10 подпроцессов на строку (или переписывать весь файл дважды для каждой строки ввода). – melpomene