如何在awk中使用多个操作来编辑文本文件

时间:2018-02-18 23:01:28

标签: linux 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

我尝试按照代码中提到的步骤但没有成功。你知道如何解决这个问题吗?

1 个答案:

答案 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的结果。