Автор Тема: Премахване на част/блок от средата на голям текстов файл.  (Прочетена 1354 пъти)

Naka

  • Напреднали
  • *****
  • Публикации: 3469
    • Профил
Имам голям текстов файл около 1GB организиран по редове (около 15 000 000)

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

Как може стане това, има ли някакви шелски команди дето правят подобно нещо или трябва да си пиша скрипт.
Досега най-доброто за което се сещам е някаква комбинация с 'head' и 'tail'
« Последна редакция: Mar 19, 2012, 15:29 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

edmon

  • Гост
cut,cat , tail, head, grep,  и тн.
Активен

dejuren

  • Напреднали
  • *****
  • Публикации: 1025
  • Distribution: Ubuntu, RedHat
  • Window Manager: lxde KDE4
    • Профил
Активен

http://webchat.freenode.net/?channels=ubuntu-bg
The quieter you become, the more you are able to hear.
Две седмици цъкане с мишката спестяват два часа четене на документацията.

Naka

  • Напреднали
  • *****
  • Публикации: 3469
    • Профил
Аха ставало с 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
« Последна редакция: Mar 19, 2012, 23:15 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

solarflux

  • Напреднали
  • *****
  • Публикации: 100
    • Профил
Аха ставало с 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' файл/тхт
Активен