对大型文本文件 (>20G) 开头附近的行重新排序
Reorder lines near the beginning of a huge text file (>20G)
我是 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 插件)打开并编辑它,但仍然效果不佳。
简单的方法是将要编辑的部分从文件中复制出来,就地修改,然后再复制回来。
# 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
在修改后具有与之前完全相同的字节大小。
这是一个 awk 版本:
$ awk 'NR>=3 && NR<=4{b=b (b==""?"":ORS) [=10=];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
并将输出重定向到新文件。如果您希望它就地执行,请对 GNU awk 使用 i inplace
。
我是 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 插件)打开并编辑它,但仍然效果不佳。
简单的方法是将要编辑的部分从文件中复制出来,就地修改,然后再复制回来。
# 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
在修改后具有与之前完全相同的字节大小。
这是一个 awk 版本:
$ awk 'NR>=3 && NR<=4{b=b (b==""?"":ORS) [=10=];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
并将输出重定向到新文件。如果您希望它就地执行,请对 GNU awk 使用 i inplace
。