Linux за българи: Форуми

Нетехнически теми => Идеи и мнения => Темата е започната от: Naka в Mar 19, 2012, 12:12



Титла: Премахване на част/блок от средата на голям текстов файл.
Публикувано от: Naka в Mar 19, 2012, 12:12
Имам голям текстов файл около 1GB организиран по редове (около 15 000 000)

Трябва да изрежа/премахна няколко блокове от средата на файла - например блокове с редове 100 000-101 000;   1 234 567-2 345 678; и т.н.

Как може стане това, има ли някакви шелски команди дето правят подобно нещо или трябва да си пиша скрипт.
Досега най-доброто за което се сещам е някаква комбинация с 'head' и 'tail'


Титла: Re: Премахване на част/блок от средата на голям текстов файл.
Публикувано от: edmon в Mar 19, 2012, 15:46
cut,cat , tail, head, grep,  и тн.


Титла: Re: Премахване на част/блок от средата на голям текстов файл.
Публикувано от: dejuren в Mar 19, 2012, 15:52
вариант: http://unix.stackexchange.com/questions/8619/how-can-i-cut-a-large-file-in-place


Титла: Re: Премахване на част/блок от средата на голям текстов файл.
Публикувано от: Naka в Mar 19, 2012, 23:08
Аха ставало с sed. :)

Например това изтрива от 2-ра до 3-та линия; 5-та линия и от 7-ма линия до края на файла.

Код:
cat file.txt | sed '2,3d;5d;7,$d'

Командите за изтриване са  2,3d  5d и 7,$d
много команди на един ред се разделят с ;

Друг начин да се напише е:
Код:
cat file.txt | sed -е '2,3d' -е '5d' -е '7,$d'

Като го пробвах установих, че няма значение поредността на командите, може и да са рабъркани или в обратен ред. Поредността на редовете също се запазва, така както е била в началото. Например ако се изтрият редове 2до3  това не променя номерата на следващите редове.

 [_]3 [_]3 [_]3


Титла: Re: Премахване на част/блок от средата на голям текстов файл.
Публикувано от: solarflux в Mar 19, 2012, 23:26
Аха ставало с sed. :)

Например това изтрива от 2-ра до 3-та линия; 5-та линия и от 7-ма линия до края на файла.

Код:
cat file.txt | sed '2,3d;5d;7,$d'

Командите за изтриване са  2,3d  5d и 7,$d
много команди на един ред се разделят с ;

Друг начин да се напише е:
Код:
cat file.txt | sed -е '2,3d' -е '5d' -е '7,$d'

Като го пробвах установих, че няма значение поредността на командите, може и да са рабъркани или в обратен ред. Поредността на редовете също се запазва, така както е била в началото. Например ако се изтрият редове 2до3  това не променя номерата на следващите редове.

 [_]3 [_]3 [_]3

stop piping cats!

безсмислено е след като сед може да си чете файлове директно...

 sed '2,3d;5d;7,$d' файл.тхт
 sed -е '2,3d' -е '5d' -е '7,$d' файл/тхт