2

最初の列に基づいて 2 つのファイルを結合し、2 番目のファイルの順序を維持するにはどうすればよいですか? 

ファイル 1:

ID1 123
ID2 234
ID3 232
ID4 344
ID5 345
ID6 867

ファイル 2

ID2 A C
ID3 G T
ID1 C T
ID4 A C
...

したがって、マージされたファイルは次のようになります。

ID2 234 A C 
ID3 232 G T 
ID1 123 C T 
ID4 344 A C 
...

IDs、最初の列の値です (両方のファイルに存在します)。ファイル 1 には、ファイル 2 よりも多くの行/ID があります。ファイル 2 のすべての がファイル 1 にありますが、ファイル 1 のすべてのIDがファイル 2 にあるわけではありません。ID

4

3 に答える 3

4

使用する1つの方法は次のawkとおりです。

awk 'FNR==NR { a[$1]=$2; next } $1 in a { print $1, a[$1], $2, $3 }' file1 file2

結果:

ID2 234 A C
ID3 232 G T
ID1 123 C T
ID4 344 A C
于 2012-11-23T11:23:29.827 に答える
2

使用join

$ join file1.txt file2.txt

ID1 123 C T
ID2 234 A C
ID3 232 G T
ID4 344 A C

:ファイルは最初にソートする必要があります。これはfile2.txtの順序を維持しませんが、それを気にしない場合はこれが最もクリーンな方法です。

最初にファイルを事前に並べ替えます。sort file1.txt -o file1.txt; sort file2.txt -o file2.txt

参加してください:join file1.txt file2.txt

一般に、いくつかの基準で並べ替えることができjoin file1.txt file.txt | sortますが、この場合file2.txt、列/基準で並べ替えることはできません。

于 2012-11-23T11:26:51.803 に答える
0

2 つのファイルを 1 行ずつ読み取り、正規表現を使用して行トークンを抽出します。抽出されたトークンは、最初のトークンをキーとして使用して、連想配列内に格納されます。2 番目のステップでは、使用可能なすべてのキーをループして、配列内に格納されている値から出力行を作成できます。

デモンストレーションのみを目的とした、php での実装例。したがって、エラーチェックは行われず、おそらくパターンをニーズに合わせて調整する必要があります。他のすべての言語でも同じことが明らかに可能です。非常に読みやすいため、phpを選択しました。

<?php
$input_file[1]=fopen('/path/input1.list','r');
$input_file[2]=fopen('/path/input2.list','r');

# read input files line by line
foreach ($input_file as $input){
    while (!feof($input)){
        $tokens=array();
        preg_match('/^(ID[0-9]+) (.+)$/',trim(fread($input)),$tokens);
        $list[$i][$tokens[1]]=$tokens[2];
   } 
}

# construct output lines:
$output_file=fopen('/path/output.list','w');
foreach ($list[1] as $key=>$val){
    $line=sprintf("%s %s%s\n", $key, $val, 
                  array_key_exists($key,$list[2])?' '.$list[2][$key]:'' );
    fwrite($output_file,$line);
}

# some house keeping
fclose($input_file[1]);
fclose($input_file[2]);
fclose($output_file);

?>

(私はこれをチェックしなかったことに注意してください。これを書き留めただけです。すぐに使用できるものではなく、出発点であることを意図しています)

于 2012-11-23T11:00:51.417 に答える