基于列重叠按行连接表

基于列重叠按行连接表

我想将 file1 与 file2 对齐,首先匹配每个文件中的第 3、5、7 列,并将 file1 中的行放置在 file2 上相应行的旁边

这是我必须在两者之间保持重叠的代码,但我想将 file2 附加到 file1。任何帮助表示赞赏!

awk 'NR==FNR {a[$3$5$7];next}($3$5$7 in a){print $0}' 

文件1

#Scaffold   Position    Ref. Nuclueotide    Pid allele count    Pid allele  Non-pid allele count    Non-pid allele  Overlapping gene/region
NW_006532398.1  202035  C   35:0:0:0:0:0    A   0:0:29:0:0:0    C   KCND2
NW_006532656.1  289646  C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532656.1  289656  C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532656.1  289666  A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532656.1  289676  A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532657.1  636 A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532657.1  646 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532657.1  656 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
NW_006532658.1  345 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1

文件2

#Scaffold   Position    Ref. Nuclueotide    Pid allele count    Pid allele  Non-pid allele count    Non-pid allele
    HiC_scaffold_7  49526089    C   0:0:28:0:0:0    A   0:31:0:0:0:0    C
    HiC_scaffold_7  49539537    C   27:0:0:0:0:0    T   0:0:0:29:0:0    C
    HiC_scaffold_7  49972546    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972556    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972566    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972576    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972586    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972596    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C
    HiC_scaffold_7  49972599    A   20:0:0:0:0:0    A   0:0:0:27:0:0    C
    HiC_scaffold_7  49972646    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C

文件3

#Scaffold   Position    Ref. Nuclueotide    Pid allele count    Pid allele  Non-pid allele count    Non-pid allele   Scaffold   Position    Ref. Nuclueotide    Pid allele count    Pid allele  Non-pid allele count    Non-pid allele  
    HiC_scaffold_7  49526089    C   0:0:28:0:0:0    A   0:31:0:0:0:0    C   NW_006532398.1  202035  C   35:0:0:0:0:0    A   0:0:29:0:0:0    C   KCND2
    HiC_scaffold_7  49539537    C   27:0:0:0:0:0    T   0:0:0:29:0:0    C   NW_006532656.1  289646  C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972546    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532656.1  289656  C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972556    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532656.1  289666  A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972566    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532656.1  289676  A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972576    A   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532657.1  636 A   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972586    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532657.1  646 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972596    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532657.1  656 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1
    HiC_scaffold_7  49972599    A   20:0:0:0:0:0    A   0:0:0:27:0:0    C                               
    HiC_scaffold_7  49972646    C   20:0:0:0:0:0    T   0:0:0:27:0:0    C   NW_006532658.1  345 C   0:26:0:0:0:0    T   0:0:26:0:0:0    C   CNTN1

答案1

首先,编辑file2并删除前导选项卡,否则字段 3、5、7 将不匹配。

awk -F"\t" '
  NR==FNR{
    a[FNR]=$3","$5","$7                  # save fields 3,5,7
    b[FNR]=(FNR==1 ? substr($0, 2) : $0) # save the line (remove first char on 1st line)
    last=FNR                             # save the last line nr
    next                                 # continue with next line
  }
  {
    printf $0                            # print current line
    for (i=1;i<=last;i++){
      if(a[i]==$3","$5","$7){            # fields 3,5,7 match?
        printf FS b[i]                   # append matching line
        a[i]=""                          # clear value
        break                            # break loop
      }
    }
    print ""
  }
' file1 file2

将字段 3,5,7 保存在数组中a,并将当前行保存$0在数组中b(如果是标题,则$0减去第一个字符)。处理 时,找到数组中第一个匹配的元素,并使用其索引追加数组行,然后清除数组元素。#
file2aba

答案2

我过去通过将egrep与sort结合起来做过类似的事情;就像是:

egrep '[A-z0-9]' file1 file2 | xargs -L1 | sed -e's/:/ /g' | sort -k4,4 -k6,6 -k8,8 -k1,1 

(排序的最后一个1,1键是第一列,其中包含文件的名称。)当然,如果任何列需要按数值排序,例如原始文件中的第 3 列,您可以执行-k4,4g或-k4,4gr反转排序顺序。我不知道您需要如何在其他列中进行排序。一旦你从“sort”开始交织,你就可以继续使用 awk 的管道,并根据第一列的内容(文件名)打印条件。在我自己的计算机上,我总是避免文件名中出现空格,因为它使此类操作更容易。 “egrep”用于获取所有行,并且只是获取在行开头打印的文件名的一种方法。这样,您就可以使用“排序”中的文件名以某种方式进行交织,这样您就可以在左侧获得所需的列。还没有测试以下内容(也许是错误,也许是笨拙),但这可能是一个开始。

egrep '[A-z0-9]' $file1 $file2 | xargs -L1 | sed -e's/:/ /g' | sort -k4,4 -k6,6 -k8,8 -k1,1 | awk -vf1="${file1}" -vf2="${file2}" 'BEGIN {last="XXX"} { if ($1==f1) { if (last != "XXX") printf("\n"); } else { if (last==f2) printf("\n blank blank blank "); } ; printf("%s %s %s",$4,$6,$8); last=$1 } END {printf("\n");} ' > output.txt

sed 的意思是删除egrep 放入的“:”,将文件名保留在单独的第一列中。如果 file2 文件名按字母顺序排在第一位,则您可能需要-1,1r在“排序”中使用 , 。意味着 file1 位于 output.txt 文件的左侧

还假设两个文件中的所有列在存储的信息中都没有空格。 “排序”会弄乱列标题的位置,因此您需要单独处理它。

相关内容