使用 shell 命令将未排序的文件合并到已排序的文件

使用 shell 命令将未排序的文件合并到已排序的文件

我想合并/加入或生成一个新的合并文件。两个文件的第一列中都包含共同的 ID。

文件 1 看起来像这样

ID
Tb927.4.4670
Tb927.8.3630
Tb09.160.4310
Tb927.8.3650

文件 2 包含每个基因的 ID 和功能,如下所示

ID              Function 1    Other field
Tb09.211.0140     A               eg
Tb11.03.0080      B               eg
Tb927.8.6200      C               eg
Tb927.7.690       D               eg

然而,我的文件 2 中缺少一些 ID,因为并非所有基因都具有已知功能,因此我的文件 2 中的字段少于文件 1 中的字段。文件 2 中的 ID 的排序方式也与文件 1 不同。

我希望我的合并文件遵循文件 1 中的顺序,并在输出中包含合并函数。对于缺失的 ID,它可以为空,也可以为 return '-' 之类的内容。

是否可以使用linux命令合并此类文件?

答案1

使用awk

awk 'NR == FNR{a[$1]=$0; next};
     ($1 in a){print a[$1]; next};
      {print $1, "-", "-"}' file2 file1

或者稍微简洁一些

awk 'NR == FNR{a[$1]=$0; next};
  {print $1 in a?a[$1]:$1FS"-"FS"-"}' file2 file1

答案2

只需使用sort(1)您的大量文件,该程序就足够智能,如果文件已经排序,则可以合并。

相关内容