Unix-比较两个文件并逐行对齐



我有两个文件:第一个有这样的所有序列名:

comp10604_c0_seq1
comp108_c0_seq1
comp11450_c0_seq1
comp11655_c0_seq1
comp11804_c0_seq1
comp13465_c0_seq1
comp13695_c0_seq1

第二个有关于这些序列的信息,但缺乏关于某些序列的信息:

comp10604_c0_seq1 AB491617.1
comp11450_c0_seq1 AM920464.1
comp11655_c0_seq1 HQ865168.1
comp11804_c0_seq1 KC900889.1
comp13465_c0_seq1 HM590421.1
comp13695_c0_seq1 GU474930.1

我想要一个替换换行符并插入序列名称的文件,如果没有信息,序列如下:

comp10604_c0_seq1 AB491617.1
comp108_c0_seq1 NAN
comp11450_c0_seq1 AM920464.1
comp11655_c0_seq1 HQ865168.1
comp11804_c0_seq1 KC900889.1
comp13465_c0_seq1 HM590421.1
comp13695_c0_seq1 GU474930.1

感谢您的帮助

您的输入显示为已排序。您可以使用join;指定缺失字段的值:

join -e "NaN" -a1 -a2 -o 1.1 2.2 first second

对于您的样本输入,它会产生:

comp10604_c0_seq1 AB491617.1
comp108_c0_seq1 NaN
comp11450_c0_seq1 AM920464.1
comp11655_c0_seq1 HQ865168.1
comp11804_c0_seq1 KC900889.1
comp13465_c0_seq1 HM590421.1
comp13695_c0_seq1 GU474930.1

如果希望对输出进行对齐,请将输出管道传输到column -t

如果您的文件经过排序,并且只想比较一列,那么devnull就有了正确的答案。

以下是使用awk:的另一种方法

awk 'NR==FNR{seq[$1]=$2;next}{print $1,($1 in seq?seq[$1]:"NaN")}' file2 file1
comp10604_c0_seq1 AB491617.1
comp108_c0_seq1 NaN
comp11450_c0_seq1 AM920464.1
comp11655_c0_seq1 HQ865168.1
comp11804_c0_seq1 KC900889.1
comp13465_c0_seq1 HM590421.1
comp13695_c0_seq1 GU474930.1

我们对file2进行迭代,首先将column2作为值存储到在column1索引的数组中。对于file1,我们打印列1,并检查该键是否存在于我们的数组中。如果是这样,我们打印它旁边的值,否则我们打印NaN

最新更新