Попытка удалить строки из файла с помощью sed – что я делаю неправильно?

У меня есть. CSV-файл, где я хотел бы удалить строки между строкой 355686 и строкой 1048576.

Я использовал следующую команду в терминале (на MacOSx):

sed -i.bak -e '355686,1048576d' trips3.csv 

Это создает файл, называемый trip3.csv.bak – но он все еще имеет в общей сложности 1 048 576 строк, когда я снова открываю его в Excel.

Любые мысли или предложения, которые у вас есть, приветствуются и оцениваются!

Я подозреваю, что проблема заключается в том, что excel использует возврат каретки (\ r, octal 015) для разделения записей, в то время как sed предполагает, что строки разделяются линией (\ n, восьмеричный 012); это означает, что sed будет обрабатывать весь файл как одну очень длинную строку. Я не думаю, что есть простой способ заставить sed заставить sed распознавать CR как разделитель строк, но с Perl это легко:

 perl -n -015 -i.bak -e 'print if $. < 355686 || $. > 1048576' trips3.csv 

(Примечание: если 1048576 – это количество «строк» ​​в файле, вы можете оставить часть || $. > 1048576 )

Не уверен в реализации osx sed, однако реализация gnu sed при передаче флага -i с расширением резервного копирования сначала копирует исходный файл в указанную резервную копию и изменяет исходный файл на месте. Вы должны ожидать увидеть уменьшенное количество строк в исходном файле trip3.csv

Некоторые заклинания, которые должны выполнять работу (если у вас установлен Ruby, очевидно)

 ruby -pe 'exit if $. > 355686' < trips3.csv > output.csv 

Если вы предпочитаете Perl / Python, просто следуйте документации, чтобы сделать что-то подобное, и все должно быть в порядке. 🙂

Кроме того, я использую один из рубиновых однострочных инструментов от Dave.

EDIT: Извините, забыли сказать, что вам нужно '> output.csv' для перенаправления stdout в файл.

 awk '!(NR>355686 && NR <1048576)' your_file 
Давайте будем гением компьютера.