忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1330 | 回复: 7

[文本处理] 脚本运行效率太差 [复制链接]

论坛徽章:
0
发表于 2018-01-30 09:53 |显示全部楼层
代码如下:
#! /bin/bash
for line in `cat BC.csv`
do
   declare -i na_num
   declare -i not_na_num
   na_num=$(echo $line|awk -F "," '{for(i=1;i<=NF;++i) if($i=="NA") ++num}END{print num}')
   sum=$(echo $line|awk -F "," '{for(i=4;i<=NF;i+=2) if($i!="NA") sum+=$i}END{print sum}')
   not_na_num=$(echo $line|awk -F',' '{for(i=4;i<=NF;i+=2) if($i!="NA") ++sum_1}END{print sum_1}')
   avg=`echo "$sum/$not_na_num"|bc`
   if [ $na_num -le 6 ] && [ `echo "$avg <= 5"|bc` -eq 1 ];then
        echo $line >> BC_filter.csv
   fi
done
数据大小也就100多兆,但是跑了好几天都还没跑完,后来投上去的其它脚本都跑完了,这个还没跑到一半,用ps aux查看了一下:
1.PNG
如图,CPU占用才13.9,而且经常处于S而非R状态,运行效率真的很慢!请问有人知道这到底是哪个步骤出了问题吗?

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2018-01-30 10:45 |显示全部楼层
用awk重写吧

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2018-01-30 15:02 |显示全部楼层
回复 1# elaine2017


"效率太差"(坐公交车太慢)...
你应说明要作什么(目的地在那)...

公交车太慢,可坐其他的,但要知道目的地在那...


1. input data
2. procedure
3. output data

论坛徽章:
0
发表于 2018-01-30 16:29 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2018-01-30 16:49 编辑

这脚本我看着眼熟,还是昨天的问题。
我试着写了个powershell版的脚本,我这脚本,写入性能还有优化余地。懒得好好写了,你先用用看吧。

我这脚本支持win,linux。

问:目前哪些版本linux能安装上powershell?
答:
◦Windows 10 IoT Core(arm32的cpu,本质上是win,树莓派硬件上的win10)
◦Raspbian Stretch(arm32的cpu,树莓派官方操作系统Raspbian,基于大便,所以叫树莓便。)
◦MAC OS X 10.11
◦Ubuntu 14.04/16.04/17.10
◦Debian8.x/9.x
◦CentOS 7.x/RHEL 7.x/Fedora25/Fedora26/Fedora27
◦open SUSE 42及以上/SUSE Linux Enterprise Server 12 SP2
◦Docker。LINUX发行版中,安装容器dockerd,docker中运行powershell。
◦Arch Linux (archl inux 没有版本号)
◦Linux AppImage 容器(portable application single binary)  https://github.com/probonopd/AppImageKit
◦Kali Linux

安装方法:
https://github.com/PowerShell/Po ... stallation/linux.md



  1. $输入文件 = 'a:\pscode\TEMP_2018\temp113\aaa.csv'
  2. $输出文件 = 'a:\pscode\TEMP_2018\temp113\bbb.csv'

  3. $f = Get-Content -LiteralPath $输入文件
  4. foreach ($一行数据 in $f)
  5. {
  6.         $NA数量 = [regex]::Matches($一行数据,'NA')
  7.         if ($NA数量.Count -le 6)
  8.         {
  9.                 $chr,$position,$cov_bc1,$met_bc1,$cov_bc2,$met_bc2,$cov_bc3,$met_bc3,$cov_bc4,$met_bc4,$cov_bc5,$met_bc5 = $一行数据 -split '\s+'
  10.                 foreach ( $temp in @($met_bc1,$met_bc2,$met_bc3,$met_bc4,$met_bc5) )
  11.                 {
  12.                         if ($temp -isnot [string])
  13.                         {
  14.                                 $n++
  15.                                 $合计 = $合计 + $temp
  16.                         }

  17.                 }

  18.                 $平均值 = $合计 / $n
  19.                 if ($平均值 -le 5)
  20.                 {
  21.                         Add-Content -Value $一行数据 -LiteralPath $输出文件
  22.                 }

  23.                 $合计 = $null
  24.                 $n = $null
  25.         }
  26. }

复制代码

论坛徽章:
0
发表于 2018-01-30 16:30 |显示全部楼层
回复 2# yinyuemi

我换了种语言写,快多了

论坛徽章:
0
发表于 2018-01-30 16:32 |显示全部楼层
回复 4# 本友会机友会摄友会

powershell我还没怎么研究过诶,我写的这个确实不行,太慢了,换了python试了一下,很快就跑完了

论坛徽章:
0
发表于 2018-01-30 16:53 |显示全部楼层
   sum=$(echo $line|awk -F "," '{for(i=4;i<=NF;i+=2) if($i!="NA") sum+=$i}END{print sum}')
   not_na_num=$(echo $line|awk -F',' '{for(i=4;i<=NF;i+=2) if($i!="NA") ++sum_1}END{print sum_1}')
   avg=`echo "$sum/$not_na_num"|bc`

上面这些代码,在大于6的时候,没必要算。
也就是说,像我写的脚本【流程】那样,
把你上述的代码,应移到 【  if ($NA数量.Count -le 6)      {】
里面算。

论坛徽章:
19
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:33黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:0915-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之青岛
日期:2018-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59CU十四周年纪念徽章
日期:2018-05-15 11:36:3815-16赛季CBA联赛之广东
日期:2018-05-14 09:52:42
发表于 2018-02-03 16:30 |显示全部楼层
回复 1# elaine2017


1次循环能解决的问题,不要使用多次循环。题主提供的代码处理1行数据就用了多次循环,所以效率差,这和语言本身无关,你可以重写优化一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP