Изменить порядок строк в начале огромного текстового файла (>20G)
Я пользователь vim и могу использовать некоторые базовые команды awk или bash. Теперь у меня есть текстовый (VCF) файл размером более 20G. Я хотел переместить строку № 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 ответа
Простой подход - скопировать раздел, который вы хотите отредактировать, из файла, изменить его на месте, а затем скопировать обратно.
# 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) $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
и перенаправить вывод в новый файл. Если вам нравится выполнять на месте, используйте i inplace
для GNU awk.