我有两个文件(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)