ksh – Unix脚本 – 需要改进性能的建议(shell脚本)
发布时间:2020-12-15 20:54:47 所属栏目:安全 来源:网络整理
导读:我有一个输入csv文件,实际上我需要在输入文件中选择第二和第三列值并需要转换两个值的时区区域(从PT到CT),一旦转换我需要替换转换后的时区值到文件. 注意:所有输入日期值都在太平洋时区,我正在转换为中央时区. 每行有5列 – 逗号分隔文件 CHID-123456323,20
我有一个输入csv文件,实际上我需要在输入文件中选择第二和第三列值并需要转换两个值的时区区域(从PT到CT),一旦转换我需要替换转换后的时区值到文件.
注意:所有输入日期值都在太平洋时区,我正在转换为中央时区. 每行有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,123456734 CHID-123433589,2017-01-09 17:16:55-08:00,2017-01-09 17:40:29-08:00,123456735 CHID-123000789,2017-01-09 17:16:52-08:00,2017-01-09 17:46:41-08:00,123456736 脚本:我写了一个下面的脚本,这给出了我期待的精确结果.但是当输入记录数增加时,需要更多时间.例如2万条记录需要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" -d@$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" -d@$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,2017-01-09 19:16:58,2017-01-09 20:04:09,2017-01-09 19:16:55,2017-01-09 19:40:29,2017-01-09 19:16:52,2017-01-09 19:46:41,123456736 解决方法
Ksh有足够的内置功能.
示例输入文件: [STEP 100] $echo $BASH_VERSION 4.4.5(2)-release [STEP 101] $cat file CHID-123456323,123456736 剧本: [STEP 102] $cat time.ksh tz=America/Chicago pattern='(.+),(.+),(.+)' while read -r line; do if [[ $line =~ $pattern ]]; then c1=${.sh.match[1]} c2=${.sh.match[2]} c3=${.sh.match[3]} c4=${.sh.match[4]} c5=${.sh.match[5]} TZ=$tz printf '%(%Y-%m-%d %T)T' "$c2" | read c2 TZ=$tz printf '%(%Y-%m-%d %T)T' "$c3" | read c3 print -r -- "$c1,$c2,$c3,$c4,$c5" else print -r -- "$line" fi done 示例输出: [STEP 103] $ksh time.ksh < file CHID-123456323,123456736 制作20,000行文件: [STEP 104] $rm -f bigfile [STEP 105] $fourlines=$(<file) [STEP 106] $for ((i=0; i<5000; ++i)); do printf '%sn' "$fourlines" >> bigfile; done [STEP 107] $wc -l bigfile 20000 bigfile 让我们对它进行性能测试: [STEP 108] $time ksh time.ksh < bigfile > newfile real 1m36.849s user 0m27.376s sys 0m46.741s [STEP 109] $tail -n 4 newfile CHID-123456323,123456736 [STEP 110] $ksh --version version sh (AT&T Research) 93u+ 2012-08-01 [STEP 111] $ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |