我有两个文件。我想根据共同的字符串,用文件2的内容替换文件1中的某个字符串。
文件1
Chr5 psl2gff exon 15907715 15907933 . + . NM_001046410
Chr2 psl2gff exon 8898358 8898394 . + . NM_001192190
文件2
NM_001046410 gene_id TUBA1D; transcript_id tubulin, alpha 3d
NM_001192190 gene_id BOD1L1; transcript_id biorientation of chromosomes in cell division 1 like 1
输出
Chr5 psl2gff exon 15907715 15907933 . + . gene_id TUBA1D; transcript_id tubulin, alpha 3d
Chr2 psl2gff exon 8898358 8898394 . + . gene_id BOD1L1; transcript_id biorientation of chromosomes in cell division 1 like 1
在文件1中,有多个相同字符串的实例,但是,文件2仅具有一次。我希望在第一列匹配时将NM _ ****等的所有实例替换为文件2的内容。之后,我想从文件中完全删除NM _ ****。
我对bash等等还很陌生。我已经到处寻找一种方法来执行此操作,但到目前为止没有一个有效。此外,文件2中的行数超过5000行,文件1中的行数更多。
任何帮助将不胜感激!
谢谢。
答案 0 :(得分:1)
这是一个join
操作。如果文件按连接键排序,并且空格不重要,则最简单
$ join -19 -21 file1 file2 | cut -d' ' -f2-
Chr5 psl2gff exon 15907715 15907933 . + . gene_id TUBA1D; transcript_id tubulin, alpha 3d
Chr2 psl2gff exon 8898358 8898394 . + . gene_id BOD1L1; transcript_id biorientation of chromosomes in cell division 1 like 1
如果文件未排序并且空白很重要awk
将是更好的解决方案
$ awk 'NR==FNR {k=$1; $1=""; a[k]=$0; next}
$NF in a {sub(FS $NF"$",a[$NF])}1' file2 file1
Chr5 psl2gff exon 15907715 15907933 . + . gene_id TUBA1D; transcript_id tubulin, alpha 3d
Chr2 psl2gff exon 8898358 8898394 . + . gene_id BOD1L1; transcript_id biorientation of chromosomes in cell division 1 like 1
锻炼对您来说是了解代码。该站点上有很多示例(> 100)正是针对此问题的,并带有许多注释脚本,其中一些是我写的。