我有一个像这个小例子的文本文件:
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
我尝试按照代码中提到的步骤但没有成功。你知道如何解决这个问题吗?
答案 0 :(得分:1)
如果具有相同ID的记录始终是连续的,您可以这样做:
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和比率。 第二个块过滤不需要的记录。 END块显示最后一个ID的结果。