我有一个像这个小例子的文本文件:
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 列
中都有 BA
和 CA
。对于每个 ID
我应该分别为 CA
和 BA
获取 2 个值,并获取 CA/BA
的比例为每个 ID
的最终值。要获得一个值作为 CA
,我应该将属于同一 ID
并归类为 CA 的
并获得一个值作为 4th column
中的所有值相加BA
,我应该将属于相同 ID
并分类的 4th column
中的所有值相加作为 BA
。最后一步是获取每个 ID
的 CA/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- 总结每组之后
(CA
和BA
):
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/