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

时间:2014-05-18 13:14:02

标签: bash 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

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

您的输入显示已排序。你可以使用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

答案 1 :(得分:1)

如果您的文件已排序,并且您希望仅比较一列,则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