
私はこのコマンドを試しています:
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
答え2
入力ファイルを並べ替え、出力を数値順に並べ替えることができます。
join -a1 -11 <(sort -k1,1 file1) <(sort -k1,1 file2) | sort -k1,1n