【问题标题】:Merging files with different column information by criteria按条件合并具有不同列信息的文件
【发布时间】:2012-07-15 19:31:53
【问题描述】:

我有三个文件,每个文件中的信息不会以任何方式重叠 - 但是,它们需要以特定方式相互合并才能有用。

第一个文件不同于后两个文件,它们的设置方式相同。 文件 1 如下所示:

rs101   12  126890980   A   G   
rs102   4   114553253   A   C   
rs103   9   172776204   C   T

文件 2 如下所示:

1   178 0.12    0.26    0.02    
1   1458    0.35    0.37    0.021   
1   318 0.99    0.105   0.08

文件 3 如下所示:

 1  3567    0.78    0.67    0.005   
 0  0   0   0   0   
 1  3567    0.34    -0.15   0.001 

我想要一个将这些文件合并到文件以生成第三个文件的脚本:

rs101   12  126890980   A   G
1   178 0.12    0.26    0.02
1   3567    0.78    0.67    0.005
rs102   4   114553253   A   C   
1   1458    0.35    0.37    0.02
0   0   0   0   0
rs103   9   172776204   C   T
1   318 0.99    0.105   0.08
1   3567    0.34    -0.15   0.001 

问题是,如果这些文件合并不正确,它们在运行分析时将无法提供正确的信息 - 我可以在每个文件的末尾添加一个唯一列(例如,rs# 可以在文件中打印两次一个(在第一列一次,在最后一列一次),然后可以在文件 2 和 3 末尾的另一列中添加相应的 rs 编号)。然后我可以手动抽查合并是否正确发生。任何见解或建议表示赞赏!

【问题讨论】:

  • 我不会发誓你永远不能使用 sed 来做这件事,但是如果我遇到这个问题,我会用 Python 之类的东西编写一个快速脚本——这是最自然的——寻找适合这项工作的工具。

标签: python perl unix sed awk


【解决方案1】:

一种使用perl的方式:

perl -e '
    open $fh1, q|<|, shift;
    open $fh2, q|<|, shift;
    open $fh3, q|<|, shift;
    while ( $l1 = <$fh1>, 
            $l2 = <$fh2>,
            $l3 = <$fh3> ) {
        printf qq|%s|, join qq||, $l1, $l2, $l3;
    }
' File1 File2 File3

输出:

rs101   12  126890980   A   G   
1   178 0.12    0.26    0.02    
1  3567    0.78    0.67    0.005   
rs102   4   114553253   A   C   
1   1458    0.35    0.37    0.021   
0  0   0   0   0   
rs103   9   172776204   C   T
1   318 0.99    0.105   0.08
1  3567    0.34    -0.15   0.001

【讨论】:

    【解决方案2】:

    一种方式,使用paste

    paste -d "\n" file1.txt file2.txt file3.txt
    

    结果:

    rs101   12  126890980   A   G   
    1   178 0.12    0.26    0.02    
    1  3567    0.78    0.67    0.005   
    rs102   4   114553253   A   C   
    1   1458    0.35    0.37    0.021   
    0  0   0   0   0   
    rs103   9   172776204   C   T
    1   318 0.99    0.105   0.08
    1  3567    0.34    -0.15   0.001
    

    这假设您的每个输入文件都包含相同数量的行。要检查每个文件(从而避免潜在的合并问题),请使用wc

    wc -l file1.txt file2.txt file3.txt

    结果:

    3 file1.txt
    3 file2.txt
    3 file3.txt
    9 total
    

    HTH

    【讨论】:

    • 这将是在 Unix 机器上进行此测试的最短和最简单的解决方案,这正是 paste 的设计目的。
    【解决方案3】:

    在 shell 中使用 文件描述符 -

    while IFS= read -r lineA && IFS= read -r lineB <&3 && IFS= read -r lineC <&4 ; do   
    echo "$lineA"; echo "$lineB"; echo "$lineC"
    done <file1 3<file2 4<file3
    

    【讨论】:

      【解决方案4】:

      在命令行上使用 Perl:

      perl -e '
          @fh = map {open my $fh, $_; $fh} @ARGV;
          print map <$_>.'', @fh until grep eof, @fh;
      ' file1.txt file2.txt file3.txt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-18
        • 2021-10-04
        • 2014-07-22
        • 2018-02-19
        • 2021-12-17
        • 1970-01-01
        • 2017-09-12
        相关资源
        最近更新 更多