需求概要描述
- 數(shù)據(jù)是csv格式轉(zhuǎn)成的,間隔為英文逗號(hào),每列數(shù)據(jù)有雙引號(hào)包含纳账。且備注數(shù)據(jù)列中本身自帶有英文逗號(hào);例如“文檔,調(diào)用”
- 系統(tǒng)應(yīng)用為C編寫的一個(gè)解密程序捺疼,即一個(gè)可執(zhí)行文件
- 現(xiàn)在需要讀取每一行數(shù)據(jù)疏虫,獲取最后一列數(shù)據(jù),用解密程序解密后,在這一行后面新增一列卧秘,并附加上解密后的內(nèi)容
- 注意保持csv原始格式呢袱,即引號(hào)逗號(hào)的格式,例如:"orderno","phone_no","加密數(shù)據(jù)","解密后數(shù)據(jù)"
實(shí)現(xiàn)
要選取好awk的分隔符翅敌,可以選用英文逗號(hào)做分隔符羞福,但是要小心備注字段中的英文逗號(hào)引起列分隔異常。如果要選用逗號(hào)做分隔符可以直接用$NF來取得最后一列蚯涮。也可以用組合分隔符治专,比如-F"["][,]["]"即","為分隔符。
此處為了方便直接用的逗號(hào)做分隔符
- 方法一:使用while read循環(huán)讀取每行遭顶,逐行處理张峰。速度120條/s左右
while read line; do res=`echo ${line} |awk -F[,] '{print $NF}'|awk -F[\"] '{print $2}'`; res1=`/data/dp_dir/decode/a.out ${res}`; echo ${line}",\""${res1}"\"">>./f1.txt; done < /data/dp_dir/decode/f.txt
- 方法二:使用awk直接讀取文件,并用system調(diào)用組合成的命令棒旗。速度120條/s左右
awk -F[,] 'BEGIN{while(getline < "/data/dp_dir/decode/f2.txt"){a=substr($NF,2,length($NF)-2);b="'\''"$0"'\'',\\\"";cmd="echo "b"`/data/dp_dir/decode/a.out "a"`\\\"";system(cmd)};close("/data/dp_dir/decode/f2.txt");}'>> f6.txt
- 方法三:使用awk直接讀取文件喘批,將組合成的命令輸出到文本,并用sh調(diào)用這個(gè)文本铣揉。速度300條/s左右
awk -F[,] 'BEGIN{while(getline < "/data/dp_dir/decode/f2.txt"){a=substr($NF,2,length($NF)-2);b="'\''"$0"'\'',\\\"";cmd="echo "b"`/data/dp_dir/decode/a.out "a"`\\\"";print cmd};close("/data/dp_dir/decode/f2.txt");}'>> f6.txt;sh f6.txt >> f7.txt
用strace -c -p跟蹤了以下谤祖,發(fā)現(xiàn)方法一和方法二花費(fèi)了96%的cpu時(shí)間在wait4調(diào)用上,所以慢了很多老速。
- 方法四 使用gnu parallel在方法三的基礎(chǔ)上加并行,方法三需要半個(gè)小時(shí)才能完成凸主,并行只需要30-40秒
wget http://ftp.gnu.org/gnu/parallel/parallel-20190422.tar.bz2
tar -jxvf parallel-20190422.tar.bz2
cd parallel-20190422.tar.bz2
./configure --prefix=/usr/local/gnu
make && sudo make install
awk -F[,] 'BEGIN{while(getline < "/data/dp_dir/decode/f2.txt"){a=substr($NF,2,length($NF)-2);b="'\''"$0"'\'',\\\"";cmd="echo "b"`/data/dp_dir/decode/a.out "a"`\\\"";print cmd};close("/data/dp_dir/decode/f2.txt");}'>> f6.txt;cat f6.txt | /usr/local/gnu/bin/parallel --pipe sh >> ./f9.txt
- 方法五 因?yàn)樵趕ystem調(diào)用中不能得到調(diào)用的結(jié)果橘券,只能獲取到執(zhí)行狀態(tài)結(jié)果,0,1或者其他什么的卿吐,所以就不逐行處理了旁舰,直接批量生產(chǎn)echo語句放入文本中,在sh調(diào)用這個(gè)文本嗡官。類似于方法四箭窜。
time awk -F[,] '{a=substr($NF,2,length($NF)-2);print "echo '\''"$0"'\'',\\\"`/data/dp_dir/decode/a.out "a"`\\\""}' f2.txt >> f11.txt;time cat f11.txt|/usr/local/gnu/bin/parallel --pipe sh >> ./f13.txt