gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:11:26 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com