我如何使用awk编辑文件

时间:2018-02-20 06:47:39

标签: awk

我有一个像这个小例子的文本文件:

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只会重复一次。每个IDBA中同时包含CA5th column。对于每个ID,我应分别获得CABA的2个值,并将CA/BA的比例作为每个ID的最终值。要获得CA一个值,我应该将4th column中属于同一ID并归类为CA的所有值相加,并将一个值加为{{1}我应该在BA中添加属于同一4th column并归类为ID的所有值。最后一步是获得BACA/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 groupCA):

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的比例。你知道如何解决问题并纠正代码吗?

1 个答案:

答案 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