2つのファイル(file1とfile2)があり、2つのファイルにない列を含む3番目のファイル(file3)をインストールしようとしています。私は通常、ソートを最初にして参加します。ただし、次の例のように、その値に文字と数字が含まれているため、機能しません。
ファイル1:
ARS-BFGL-BAC-1180 14 20574088
ARS-BFGL-BAC-11805 12 14897445
ARS-BFGL-BAC-11852 1 34309921
ARS-BFGL-BAC-11867 13 12616676
ファイル2
AC16359 ARS-BFGL-BAC-11798 B B
AC16359 ARS-BFGL-BAC-11805 B B
AC16359 ARS-BFGL-BAC-1180 B B
AC16359 ARS-BFGL-BAC-11852 A A
AC16359 ARS-BFGL-BAC-11867 B B
私は両方のために同じソートコマンドを使用し、最後のSNP_Name 11805は1180よりも高く、他方はそうではありません。
ベストアンサー1
一致するフィールドでのみソートします(例:file1の場合は-k1,1、file2の場合は-k2,2)。
例えば
$ join -1 1 -2 2 <(sort -k1,1 file1) <(sort -k2,2 file2)
ARS-BFGL-BAC-1180 14 20574088 AC16359 B B
ARS-BFGL-BAC-11805 12 14897445 AC16359 B B
ARS-BFGL-BAC-11852 1 34309921 AC16359 A A
ARS-BFGL-BAC-11867 13 12616676 AC16359 B B
最初はバージョンソートのみを試しました(-V
非標準--version-sort
オプションであり、GNUまたは* BSDソートが必要です)。これはとの有無にかかわらず動作します-k1,1
が、-k2,2
より大きいまたは他のデータファイルセットでは安定して動作しない可能性があります。
キーフィールドに4桁または5桁(およびより多くの変形可能)を含めることができることを考慮して、以下を使用してください。自然な順序理想的です。だからバージョンソートを使用します。そしてキーフィールドを指定します。
join -1 1 -2 2 <(sort -V -k1,1 file1) <(sort -V -k2,2 file2)