Изменить порядок строк в начале огромного текстового файла (>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.

Другие вопросы по тегам