2

私は 3 つのファイルを持っていますが、それぞれの情報はまったく重複していません。

最初のファイルは、同じように設定された 2 番目の 2 つのファイルとは異なります。ファイル 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 

これらをファイルにマージして 3 番目のファイルを生成するスクリプトが必要です。

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 

問題は、これらのファイルが正しくマージされていない場合、分析を実行したときに正しい情報が提供されないことです。各ファイルの最後に一意の列を追加できます (たとえば、ファイル 1 に rs# が 2 回出力される可能性があります (1 回))。最初の列に 1 回、最後の列に 1 回)、対応する rs 番号をファイルの末尾の別の列に追加することができます 2 および 3)。次に、マージが正しく行われたことを手動でスポット チェックすることができました。洞察や提案は大歓迎です!

4

4 に答える 4

5

片道、使用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

于 2012-07-16T23:10:41.380 に答える
2

コマンド ラインで Perl を使用する場合:

perl -e '
    @fh = map {open my $fh, $_; $fh} @ARGV;
    print map <$_>.'', @fh until grep eof, @fh;
' file1.txt file2.txt file3.txt
于 2012-07-17T03:17:58.150 に答える
1

シェルでのファイル記述子の使用-

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
于 2012-07-16T23:38:51.773 に答える
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
于 2012-07-16T21:59:45.200 に答える