我有一个像这个小例子的文本文件:
chr10:103909786-103910082 147 148 24 BA
chr10:103909786-103910082 149 150 11 BA
chr10:103909786-103910082 150 151 2 BA
chr10:103909786-103910082 152 153 1 BA
chr10:103909786-103910082 274 275 5 CA
chr10:103909786-103910082 288 289 15 CA
chr10:103909786-103910082 294 295 4 CA
chr10:103909786-103910082 295 296 15 CA
chr10:104573088-104576021 2925 2926 134 CA
chr10:104573088-104576021 2926 2927 10 CA
chr10:104573088-104576021 2932 2933 2 CA
chr10:104573088-104576021 58 59 1 BA
chr10:104573088-104576021 689 690 12 BA
chr10:104573088-104576021 819 820 33 BA
在此文件中有5个tab separated
列。第一列被视为ID。例如,在第一行中,整个" chr10:103909786-103910082
"是ID。
1-
我想基于第4列过滤出行。
如果4th column is less than 10
和同一行但在5th column the group is BA
中的数字,该行将被过滤掉。如果4th column is less than 5
中的数字和5th column the group is CA
中的相同行中的数字也会过滤掉。
3-
第3步:
我想得到4th column
中的数字比率。实际上在1st column
中有重复的值代表相同的ID
。我希望每ID
得到一个比率,因此在输出中每个ID
只会重复一次。每个ID
在BA
中同时包含CA
和5th column
。对于每个ID
,我应分别获得CA
和BA
的2个值,并将CA/BA
的比例作为每个ID
的最终值。要获得CA
一个值,我应该将4th column
中属于同一ID
并归类为CA
的所有值相加,并将一个值加为{{1}我应该在BA
中添加属于同一4th column
并归类为ID
的所有值。最后一步是获得BA
每CA/BA
的比例。小例子的预期输出如下所示:
ID
:
1- after filtration
chr10:103909786-103910082 147 148 24 BA
chr10:103909786-103910082 149 150 11 BA
chr10:103909786-103910082 274 275 5 CA
chr10:103909786-103910082 288 289 15 CA
chr10:103909786-103910082 295 296 15 CA
chr10:104573088-104576021 2925 2926 134 CA
chr10:104573088-104576021 2926 2927 10 CA
chr10:104573088-104576021 689 690 12 BA
chr10:104573088-104576021 819 820 33 BA
(2- after summarizing each group
和CA
):
BA
3- chr10:103909786-103910082 147 148 35 BA
chr10:103909786-103910082 274 275 35 CA
chr10:104573088-104576021 2925 2926 144 CA
chr10:104573088-104576021 819 820 45 BA
(此比率使用第4列中的值进行):
final output
在上面的行中,1 = 35/35和3.2 = 144/45。
我想在chr10:103909786-103910082 1
chr10:104573088-104576021 3.2
awk
我尝试使用代码但没有成功。此代码返回一个数字。事实上,所有CA的总和除以所有awk 'ID==$1 {
if (ID) {
print ID, a["CA"]/a["BA"]; a["CA"]=a["BA"]=0;
}
ID=$1
}
$5=="BA" && $4>=10 || $5=="CA" && $4>=5 { a[$5]+=$4 }
END{ print ID, a["CA"]/a["BA"] }' file.txt
的总和,但我希望每个ID都这样做,并获得每个ID的比例。你知道如何解决问题并纠正代码吗?
答案 0 :(得分:2)
awk '$4 >= 5 && $5 == "CA" { a[$1]+=$4 }
$4 >= 10 && $5 == "BA" { b[$1]+=$4 }
END{ for ( i in a) print i,a[i]/b[i]}' file
输出:
chr10:103909786-103910082 1
chr10:104573088-104576021 3.2