我有两个文件: 第一个包含所有序列名称:
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
感谢您的帮助
答案 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
。