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

标签 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 个 制表符分隔 列。第一列被视为 ID。例如在第一行中,整个“chr10:103909786-103910082”是 ID。

1- 在第 1 步中,我想根据第 4 列过滤掉行。 如果 第 4 列中的数字小于 10 并且同一行中的 第 5 列中的组为 BA,则该行将被过滤掉。同样,如果第 4 列中的数字小于 5 且同一行中的第 5 列中的组为 CA,则该行将被过滤掉。

3- 第三步: 我想获取 4th column 中的数字比率。事实上,在 1st 列 中有代表相同 ID 的重复值。我想为每个 ID 获得一个比率,因此在输出中每个 ID 将只重复一次。每个 ID第 5 列 中都有 BACA。对于每个 ID 我应该分别为 CABA 获取 2 个值,并获取 CA/BA 的比例为每个 ID 的最终值。要获得一个值作为 CA,我应该将属于同一 ID 并归类为 CA 的 4th column 中的所有值相加 并获得一个值作为 BA,我应该将属于相同 ID 并分类的 4th column 中的所有值相加作为 BA。最后一步是获取每个 IDCA/BA 比例。小示例的预期输出如下所示:

1-过滤后:

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- 总结每组之后(CABA):

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

3- 最终输出(这个比率是使用第 4 列中的值得出的):

chr10:103909786-103910082   1
chr10:104573088-104576021   3.2

在上面的行中,1 = 35/35 和 3.2 = 144/45。

我正尝试在 awk 中这样做

awk -F "\t" '{ (if($4 < -10 & $5==BA)), (if($4 < -5 & $5==CA)) ; print $2 = BA/CA} file.txt > out.txt

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

最佳答案

如果具有相同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

第一个 block 测试 ID 是否已更改,在本例中,它显示以前的 ID 和比率。 第二个 block 过滤不需要的记录。 END block 显示最后一个 ID 的结果。

关于linux - 如何在 awk 中使用多个操作来编辑文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48857534/

相关文章:

python - Perl、Python、AWK 和 sed 有什么区别?

linux - 我如何 grep 整个代码行,可能是包装的代码行?

python - 新安装的 Fenics 演示在 MPICH_NUMVERSION 上崩溃

linux - Linux 内核中的 realloc() 是否有以下限制?

linux - 使用sed从文本文件中的文件中删除多个文件名

linux - 根据 bash 或 awk 中一行中的值对列重新排序

linux - 多个字符串到一个字符串比较bash

linux - 模拟 WORM 媒体

unix - 在awk中将时间戳转换为EPOCH

Linux awk 命令与管道