从文件中提取与第二个文件匹配的行并将它们合并为单个文件

从文件中提取与第二个文件匹配的行并将它们合并为单个文件

我有一个文件包含一些位置,

head positions
142541687
142541814
142541910
142542976
142544533
142546366
142548674
142560386

我有另一个文件夹包含1800个文件,每个文件属于一个人(总共1800个人)。第 2 列是位置,第 4 列是个人 ID:

 head NA20507.mapped.ILLUMINA.bwa.TSI.low_coverage.20130415.bam_dp
1   142541687   78 NA20507
1   142535975   79 NA20507
1   142535976   79 NA20507
1   142535977   77 NA20507
1   142535978   78 NA20507
1   142535979   77 NA20507

或另一个人的例子,

head NA20901.mapped.ILLUMINA.bwa.GIH.low_coverage.20120522.bam_dp
1   142541687   135 NA20901
1   142535975   135 NA20901
1   142535976   137 NA20901
1   142535977   138 NA20901
1   142535978   138 NA20901
1   142535979   136 NA20901
1   142535980   135 NA20901

对于每个单独的文件,我只想保留那些具有位置文件中的位置的行(单个文件的第二列与位置文件匹配),但是我想单独为每个位置存储它!

   cat NA20507.mapped.ILLUMINA.bwa.TSI.low_coverage.20130415.bam_dp_match142541687
        1   142541687   78 NA20507

最后,我想合并所有个人的这些文件:例如,位置 142541687

head desired_pos142541687
1   142541687   78  NA20507
1   142541687   135 NA20901

或职位142542976;

desired_pos142542976

    1   142535976   79 NA20507
    1   142535976   137 NA20901

答案1

这或多或少与您已经遇到的类似问题的答案相同:首先读取一个文件(位置),然后解析其他文件并提取数据。

awk 'NR == FNR { pos[$1]=1; next } $2 in pos { f="desired_pos" $2; print >>f; close(f) }' positions NA*.bam_dp

如果给出问题中的两个单独文件,并且positions包含 142535975,则将创建desired_pos142535975包含以下内容的文件:

1   142535975   79 NA20507
1   142535975   135 NA20901

假设所有位置都涉及染色体 1(或至少是相同的染色体(如各个文件中的染色体),因为除了文件中的位置之外没有染色体名称信息positions

相关内容