awk - 将文件中的所有列与同一文件中的引用列进行比较
问题描述
我有一个这种格式的 TAB 文件(SNPs 文件):
位置-->参考样本-->sample1-->sample2-->sample3-->等
Location Reference Sample1 Sample2 Sample3
1_56 T A G C
1_226 A A C G
1_670 G T G G
目标是创建一个循环,将每个样本值与参考值进行比较。如果不匹配,我需要为每个样本打印出行和列。这就是我想出的:
awk '$2 != $3 && $3 != "." { print $1 $2 $3 }' ~FILEPATH/All_SNPs_annotated.txt >> sample1_SNPs_ready
此输出的格式本质上是第 3 列与参考列不匹配的所有实例的列表,以及与单个样本不匹配的位置,如下所示:
LocationReferenceSample1
1_56TA
1_670GT
LocationReferenceSample2
1_56TG
1_226AC
LocationReferenceSample3
1_56TC
1_226AG
但是每个样本都会创建自己的文件。
问题是我必须手动更改 $3 值才能在列中移动 - 有没有办法做到这一点,以便它自己循环遍历每一列?如果我有四个样本,这可行,但是我现在有 300+,这使得这有点不可行。
这让我得到了我需要的专栏。我的预感是我需要创建一个循环,告诉它遍历列,然后在该循环中添加一个类似于上面的 awk 命令。
但这不会为每个样本输出一个单独的文件。
我更新了信息,希望它现在更有帮助。
解决方案
awk 'NR == 1 {
split($0, names)
}
{
for (s = 3; s <= NF; s++) {
if ($s != $2 && $s != ".") {
print $1 $2 $s > names[s]
}
}
}' file
$ tail -n +1 Sample*
==> Sample1 <==
LocationReferenceSample1
1_56TA
1_670GT
==> Sample2 <==
LocationReferenceSample2
1_56TG
1_226AC
==> Sample3 <==
LocationReferenceSample3
1_56TC
1_226AG
推荐阅读
- javascript - 如何使用节点刷新 JWT 令牌并做出反应
- kubernetes - Kubernetes 中的示例容器化应用程序无法在 Prometheus 中显示为用于抓取指标的目标
- excel - Excel VBA更新范围内的单元格
- reactjs - 使用反应钩子更新 setState
- android - 如何在 Android 11 中的 Whatsapp .Status 文件夹中的特定文件夹中保存 ImageView 中的图像
- flutter - 无效参数(输入):不能为空
- javascript - Javascript | 链接/书签以删除 url 中的变量
- sql - 如何在 BigQuery 中旋转?
- javascript - 当某个条件变为真时,有没有办法重新定义“让”值?
- python - 有人可以解释这个递归函数吗?我知道这个函数是如何倒数到零的,但不知道它是如何倒数到 num1 的?