番号付きインデックスを使用したファイルの結合

番号付きインデックスを使用したファイルの結合

私はこのコマンドを試しています:

join -a1 -11 file1 file2 > file3

ファイル1は次のようになります。

1
2
3
4
5
6
7
8
9
10
11

ファイル2:

1    lkj    klj    lkj
2    lkj    lkj    lkj
3
7    lkj    lkj    lkj
8
9
11    lkk    kll    lkk

出力では、行番号11をスキップします。

Googleで検索したときにアルファベット順だけを理解していることに気づきましたが、joinこれを行う方法が必要です。私の目標は、遺伝プロジェクトに60,000,000の5つのラインファイルを追加することです。

どうすればいいですか?joinこれを機能させる他のツールやオプションはありますか?

ベストアンサー1

あなたの大容量ファイルがすでにソートされているとします。次の方法では追加のソートは必要ありません。

以下を使用して、単にキーの前にゼロを追加できますsed。プロセスはパイプラインなので、処理する一時ファイルはありません。オーバーヘッドsedは無視できます。


# make key 9 digits    # Add 9 leading 0's       # Remove excess 0's  
join -a1 -11 <(sed -r 's/^([0-9]+)/000000000\1/; s/^0+([0-9]{9})/\1/' file1) \
             <(sed -r 's/^([0-9]+)/000000000\1/; s/^0+([0-9]{9})/\1/' file2)

出力は次のとおりです

000000001 lkj klj lkj
000000002 lkj lkj lkj
000000003
000000004
000000005
000000006
000000007 lkj lkj lkj
000000008
000000009
000000010
000000011 lkk kll lkk

出力にゼロを表示したくない場合は、代わりにこのコマンドを使用してください。先行ゼロが
さらにsed -r 's/^0+//'削除されます。

join -a1 -11 <(sed -r 's/^([0-9]+)/000000000\1/;s/^0+([0-9]{9})/\1/' file1) \
             <(sed -r 's/^([0-9]+)/000000000\1/;s/^0+([0-9]{9})/\1/' file2) |
               sed -r 's/^0+//'   

出力

1 lkj klj lkj
2 lkj lkj lkj
3
4
5
6
7 lkj lkj lkj
8
9
10
11 lkk kll lkk

おすすめ記事