- 论坛徽章:
- 0
|
现有数据格式如下,一共有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
我用了一个小文件做测试,是能够跑出结果的,但是提示语法报错,也没有说第几行错了,所以我到底是哪里没弄对呢?
|
|