我是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插件)打开并编辑它,但仍然无法正常工作。
答案 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 -> 68
和5 -> 69
并将输出重定向到新文件。如果你&#39;喜欢它就地执行,使用i inplace
作为GNU awk。