使用字母和数字进行排序和连接

使用字母和数字进行排序和连接

我有两个文件(file1 和 file2),我想安装第三个文件(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

仅按匹配字段排序(即 -k1,1 对于 file1,-k2,2 对于 file2)。

例如

$ 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)

相关内容