用另一个文件中相同行号的相同行替换一个文件中的多行?

Replace multiple lines in one file with the same lines at the same line numbers in another file?

我有一个修改过的 gff 文件,它缺少原始 gff 文件中存在的一些行。我想把它们加回去。

即 原始 gff 文件,在每个新重叠群之前包含额外的行“# Fasta ...”和“##sequence-region”:

1 # Fasta 定义行:>contig00047
2 ##序列区域
3 contig00047 AUGUSTUS 旧注释
4 contig00047 AUGUSTUS 旧注释
5 contig00047 AUGUSTUS 旧注释
6 contig00047 AUGUSTUS 旧注释
7 contig00047 AUGUSTUS 旧注释
8 contig00047 AUGUSTUS 旧注释
9 # Fasta 定义行:>contig00048
10 ##序列区域
11 contig00048 AUGUSTUS 旧注释
12 contig00048 AUGUSTUS 旧注释
13 contig00048 AUGUSTUS 旧注释
14 contig00048 AUGUSTUS 旧注释

这里是新修改的 gff 文件格式,缺少那些额外的行:

1 contig00047 AUGUSTUS 新注释
2 contig00047 AUGUSTUS 新注释
3 contig00047 AUGUSTUS 新注释
4 contig00047 AUGUSTUS 新注释
5 contig00047 AUGUSTUS 新注释
6 contig00047 AUGUSTUS 新注释
7 contig00048 AUGUSTUS 新注释
8 contig00048 AUGUSTUS 新注释
9 contig00048 AUGUSTUS 新注释
10 contig00048 AUGUSTUS 新注释

这就是我想要的:

1 # Fasta 定义行:>contig00047
2 ##序列区域
3 contig00047 AUGUSTUS 新注释
4 contig00047 AUGUSTUS 新注释
5 contig00047 AUGUSTUS 新注释
6 contig00047 AUGUSTUS 新注释
7 contig00047 AUGUSTUS 新注释
8 contig00047 AUGUSTUS 新注释
9 # Fasta 定义行:>contig00048
10 ##序列区域
11 contig00048 AUGUSTUS 新注释
12 contig00048 AUGUSTUS 新注释
13 contig00048 AUGUSTUS 新注释
14 contig00048 AUGUSTUS 新注释

我已将原始文件导入 R 并更新了注释,但它丢失了以“#”开头的行。我需要那些回来让我的 gff 有效。 我尝试使用 grep 获取原始 gff 中以 #:

开头的所有行的行号

$ grep -n "#' Renamed_Blast2GO_gff_without_contig.gff | cut -f1 -d: > line.txt

然后我在gedit里打开line.txt搜索了一下,把所有的\n'都换成了G;在第 1 行中获取一个长字符串。然后我在修改后的 gff 文件中使用 sed 在第 1 行字符串中指定的每个行号之后添加了空行:

$ sed '<\paste line 1 string here>' mod2_gff.gff
i.e.,
$ sed '1G;2G;9G;10G' mod2_gff.gff # My file is actually really big, so this gets quite long, but still works.

现在我想用原始文件中的行替换修改后文件中的空行。我尝试了各种方法,但一直无法正常工作。字符串“##sequence-region”不是唯一的,因此在这种情况下进行键值设置将不起作用。我不确定是否可以逐行查询,并查看下一行何时有新的重叠群编号,然后在其上方插入两行匹配的#Fasta 定义行和##sequence-region线?

感谢大家提供的任何帮助!

awk 救援!

只需将缺少的headers添加到新文件

$ awk 'p!= {print "# Fasta definition line: >" ; 
              print "##sequence-region"; 
              p=}1' file

# Fasta definition line: >contig00047
##sequence-region
contig00047 AUGUSTUS new annotation
contig00047 AUGUSTUS new annotation
contig00047 AUGUSTUS new annotation
contig00047 AUGUSTUS new annotation
contig00047 AUGUSTUS new annotation
contig00047 AUGUSTUS new annotation
# Fasta definition line: >contig00048
##sequence-region
contig00048 AUGUSTUS new annotation
contig00048 AUGUSTUS new annotation
contig00048 AUGUSTUS new annotation
contig00048 AUGUSTUS new annotation