Попытка удалить строки из файла с помощью sed – что я делаю неправильно?
У меня есть. CSV-файл, где я хотел бы удалить строки между строкой 355686 и строкой 1048576.
Я использовал следующую команду в терминале (на MacOSx):
sed -i.bak -e '355686,1048576d' trips3.csv
Это создает файл, называемый trip3.csv.bak – но он все еще имеет в общей сложности 1 048 576 строк, когда я снова открываю его в Excel.
- Удаление пробелов в excel или csv или текстовом файле
- Результаты Sed / grep в форматированный файл excel
- Скопировать и переименовать новые файлы с именами файлов из листа excel?
- Как использовать команду sed для удаления нескольких строк
- Unix: отобразить строку x в файле (где x - переменная)
Любые мысли или предложения, которые у вас есть, приветствуются и оцениваются!
- как преобразовать резервную копию базы данных в файл csv или xls
- Запись на лист Excel с использованием Bash
- сопоставление элементов в нескольких столбцах из двух файлов, затем обновление или объединение их
- Обрезка нового символа строки из строки в bash
- Заполнение пустых полей
- Удалить строки, содержащие слова из списка слов
Я подозреваю, что проблема заключается в том, что 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