免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2316 | 回复: 4

[文本处理] 代码运行报错,但是又能成功运行 [复制链接]

论坛徽章:
0
发表于 2018-01-26 10:00 |显示全部楼层
现有数据格式如下,一共有5个样本,每个样本又包括cov和met两项,position这一列是所有样本共用的,有些数据没有,所以用NA表示,现在要对这个数据进行过滤,要求是
①最多只能有3个样本(也就是6列)出现NA,否则就过滤掉
②每个样本的met相加求平均值,平均值>5则过滤
通过上述两个条件的被保留下来
chr  position  cov_bc.1  met_bc.1  cov_bc.2  met_bc.2  cov_bc.3  met_bc.3  cov_bc.4  met_bc.4  cov_bc.5  met_bc.5
1     12390      NA          NA              12          34           12           0               34          9.33      NA             NA
...........
...........




现在我的代码如下:
#!/bin/bash
for line in `cat 1.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 >> test_filter.csv
        else
                continue
   fi
done




我用了一个小文件做测试,是能够跑出结果的,但是提示语法报错,也没有说第几行错了,所以我到底是哪里没弄对呢?        

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
发表于 2018-01-26 17:38 |显示全部楼层
回复 1# elaine2017

建议学习使用 powershell

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
发表于 2018-01-27 11:57 |显示全部楼层
本帖最后由 wh7211 于 2018-01-27 12:00 编辑

回复 1# elaine2017


用awk来做非常简单,给你一个例子:
cat 1.csv
chr  position  cov_bc.1  met_bc.1  cov_bc.2  met_bc.2  cov_bc.3  met_bc.3  cov_bc.4  met_bc.4  cov_bc.5  met_bc.5
1    12390     NA        NA        12        15        12        0         34        15        NA        NA
2    12391     NA        NA        12        3         12        3         34        3         NA        NA
3    12392     NA        NA        NA        NA        NA        NA        34        3         NA        NA
4    12393     NA        NA        NA        NA        NA        NA        NA        NA        NA        NA
  1. awk 'NR>1{for(i=4;i<=NF;i+=2){if($i~"NA"){a++}else{b=b+$i;c++}};if(a<=3&&b/c<=5){print};a=b=c=""}' 1.csv
复制代码

输出:
2    12391     NA        NA        12        3         12        3         34        3         NA        NA

论坛徽章:
0
发表于 2018-01-29 11:16 |显示全部楼层
回复 3# wh7211

多谢,问题我已经解决了,但是你的代码比我的看起来简洁多了,学习了。

论坛徽章:
0
发表于 2018-01-29 14:51 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP