首页 > 解决方案 > 将文件中的所有列与同一文件中的引用列进行比较

问题描述

我有一个这种格式的 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

解决方案


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

推荐阅读