重新排序巨大文本文件开头附近的行(> 20G)

时间:2017-05-15 20:04:44

标签: bash vim dd

我是vim用户,可以使用一些基本的awk或bash命令。现在我有一个大小超过20G的文本(vcf)文件。我想要的是将第69行移到第66行以下:

$less huge.vcf
...
    66 ##contig=<ID=9,length=124595110>                                                                                                                                                       
    67 ##contig=<ID=X,length=171031299>                                                                                                                                                       
    68 ##contig=<ID=Y,length=91744698>                                                                                                                                                        
    69 ##contig=<ID=MT,length=16299>
...

我想要的是:

...
    66 ##contig=<ID=9,length=124595110>     
    67 ##contig=<ID=MT,length=16299>                                                                                                                                                  
    68 ##contig=<ID=X,length=171031299>                                                                                                                                                       
    69 ##contig=<ID=Y,length=91744698>                                                                                                                                                        
...

我尝试使用vim(已安装LargeFile插件)打开并编辑它,但仍然无法正常工作。

2 个答案:

答案 0 :(得分:13)

简单的方法是从文件中复制要编辑的部分,将其修改为原位,然后将其复制回来。

# extract the first hundred lines
head -n 100 huge.txt >start.txt

# modify that extracted subset
vim start.txt

# copy that section back into the beginning of larger file
dd if=start.txt of=huge.txt conv=notrunc

请注意,这仅适用于您的修改不会更改要修改的部分的大小的情况。也就是说 - 确保start.txt在修改之前具有完全相同的字节大小。

答案 1 :(得分:1)

这是一个awk版本:

$ awk 'NR>=3 && NR<=4{b=b (b==""?"":ORS) $0;next}1;NR==5 {print b}' file
...
    66 ##contig=<ID=9,length=124595110>
    69 ##contig=<ID=MT,length=16299>
    67 ##contig=<ID=X,length=171031299>
    68 ##contig=<ID=Y,length=91744698>
...

但是,您需要更改代码中的行号。 3 -> 67, 4 -> 685 -> 69并将输出重定向到新文件。如果你&#39;喜欢它就地执行,使用i inplace作为GNU awk。