Удалить пустые строки в файле с

Обновлено: 02.07.2024

В вашей "пустой" строке могут быть пробелы или символы табуляции. Используйте классы POSIX с sed чтобы удалить все строки, содержащие только пробелы:

Более короткая версия, которая использует ERE, например, с gnu sed:

(Обратите внимание, что sed НЕ поддерживает PCRE.)

Мне не хватает решения awk :

Что будет возвращено:

Как это работает? Так как NF означает "количество полей", эти пустые строки имеют 0 fiedls, так что awk оценивает от 0 до False и ни одна строка не печатается; однако, если есть хотя бы одно поле, оценка имеет значение True и делает awk выполнение по умолчанию: распечатать текущую строку.

sed '/^$/d' должно быть хорошо, ожидаете ли вы изменить файл? Если это так, вы должны использовать флаг -i .

Я считаю, что это самый простой и быстрый:

Если вам нужно игнорировать все линии белого пространства, попробуйте следующее:

С помощью принятого ответа здесь и принятого ответа выше, я использовал:

Это охватывает все базы и отлично работает для моих нужд. Престижность оригинальным плакатам @Kent и @kev

Вы можете сказать:

Вы можете сделать что-то подобное, используя также "grep":

Это также работает в awk.

Скорее всего, вы видите непредвиденное поведение, потому что ваш текстовый файл был создан в Windows, поэтому в конце последовательности строк \r\n . Вы можете использовать dos2unix для преобразования его в текстовый файл в стиле UNIX перед запуском sed или использованием

удалить пустые строки независимо от того, есть ли возврат каретки.

Мой bash -specific ответ - рекомендую использовать для этого оператор подстановки perl с глобальным флагом g шаблона:

Этот ответ иллюстрирует учет наличия или отсутствия пустых строк в них ( [\ ]* ), а также использование | разделить несколько поисковых терминов/полей. Протестировано на macOS High Sierra и CentOS 6/7.

К сведению, оригинальный sed '/^$/d' $file OP с исходным кодом sed '/^$/d' $file прекрасно работает в терминале bash на macOS High Sierra и CentOS 6/7 Linux на высокопроизводительном суперкомпьютерном кластере.

Я хочу удалить пустые строки из моего файла, против, что я использую код ниже.

Но проблема в том, что мой файл слишком большой (8 линий lac), поэтому он занимает много времени. Так есть ли другой способ сделать это быстрее?

спросил(а) 2020-02-29T14:23:05+03:00 1 год, 8 месяцев назад

Вместо того, чтобы делать ReadLine(), я бы выполнил StreamReader.ReadToEnd(), чтобы загрузить весь файл в память, а затем сделать строку. Replace ("\n\n", "\n"), а затем сделать streamWrite. Запись (строка) в файл. Таким образом, не происходит много избиения, памяти или диска.

ответил(а) 2020-02-29T14:42:28.117955+03:00 1 год, 8 месяцев назад

Наилучшее решение может зависеть от типа диска: SSD и вращающаяся ржавчина ведут себя по-разному. У вашего нынешнего подхода есть преимущество перед ответом Стива на возможность обработки (например, кодирование текстовых данных как двоичных), в то время как данные все еще сходят с диска. (С буферизацией и фоном IO, здесь много потенциальной асинхронности.) Конечно, стоит попробовать оба подхода. (Очевидно, ваш подход также использует меньше памяти).

Однако есть один аспект вашего кода, который определенно субоптимален: создание копии результатов. Вам не нужно это делать. Вместо этого вы можете использовать перемещения файлов, которые намного эффективнее, если они все находятся на одном диске. Чтобы вы не потеряли данные, вы можете сделать два хода и удалить:

    Перенесите старый файл в резервное имя файла Перенесите новый файл в прежнее имя файла. Удалить имя файла резервной копии

Похоже, именно это делает File.Replace для вас, что значительно упрощает его, а также сохраняет исходные метаданные.

Если что-то пойдет не так после первого хода, вы останетесь без "правильного" файла из старого или нового, но вы можете обнаружить это и использовать имя файла резервного копирования для чтения в следующий раз.

Конечно, если это должно произойти как часть веб-запроса, вы можете сделать всю обработку в фоновом задании - обработка 800 000 строк текста, скорее всего, займет больше времени, чем вы действительно хотите, чтобы веб-запрос принимал.,

В вашей «пустой» строке могут быть пробелы или символы табуляции. Используйте классы POSIX с, sed чтобы удалить все строки, содержащие только пробелы:

Более короткая версия, которая использует ERE, например, с gnu sed:

(Обратите внимание, что sed НЕ поддерживает PCRE.)

@HuStmpHrrr gnu sed вообще не поддерживает PCRE. это ERE с -r OS X требуется sed -i "" '/^[[:space:]]*$/d' <filename> , @BernieReiter ^\s*$ будет соответствовать всем «пустым» строкам, здесь означает «пустое», строка не содержит символов или строка содержит только пустые строки (например, пробелы). Все совпавшие строки будут удалены командой sed d .

Мне не хватает awk решения:

Как это работает? Так как NF обозначает «количество полей», эти строки, которые являются пустыми, имеют 0 строк, так что awk оценивает 0 как False и строка не печатается; однако, если есть хотя бы одно поле, оценка имеет значение True и awk выполняет свое действие по умолчанию: вывести текущую строку.

Whoah. Даже работает с "свернутой" версией BSD awk (версия 20121220 (FreeBSD). Спасибо :-) @ BernieReiter, добро пожаловать :) Да, это очень простая идиоматическая вещь, которую позволяют все версии awk. И это намного быстрее, хотя - для быстрого и грязного теста - я дважды вызываю awk: $ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -) real 0m0.006s user 0m0.000s sys 0m0.008s $ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -) real 0m0.014s user 0m0.002s sys 0m0.006s знаете ли вы изящный способ включить это в сценарий awk, например, в шаблон? awk '/ mypattern / ' Обратите внимание, что при этом также будут игнорироваться строки только с пробелами.

sed '/^$/d' должно быть хорошо, вы ожидаете изменить файл на месте? Если это так, вы должны использовать -i флаг.

Возможно, эти строки не пусты, поэтому, если это так, посмотрите на этот вопрос. Удалите пустые строки из txtfiles, удалите пробелы в начале и конце строки. Я считаю, что это то, чего вы пытаетесь достичь.

да. Я изменяю файл. * .csv. как поместить -i в команду sed? Они показывают правильно в вашем интернет - инструмент, но [] должен не быть экранированы в выражении скобки, поэтому здесь код не является правильным для \[\[:space:\]\] или \[ \t\] - должно быть [[:space:]] и [ \t] . @BenjaminW. Спасибо, что поймали это. Они не были от оригинального автора, но пришли из Edit 3, когда он был изменен с обычного текста на «код», который затем «выставил» экранирование «\». Я исправил их сейчас.

Я считаю, что это самый простой и быстрый:

Если вам нужно также игнорировать все пробелы, попробуйте следующее:

Не нужно cat , также grep принимает файлы: grep . file.txt Да, я знаю, но в первоначальном вопросе не упоминалось, является ли источник файлом или чем-то еще, поэтому решение - это то, что следует после «|», а перед ним просто пример источника. Просто чтобы отличить решение от источника линий. grep '\S' определенно не портативен. Если у вас есть, grep -P то вы можете использовать, grep -P '\S' но это поддерживается не на всех платформах. Недостатком по grep . сравнению с другими решениями является то, что он выделит весь текст красным цветом. Другие решения могут сохранить оригинальные цвета. Сравните unbuffer apt search foo | grep . с unbuffer apt search foo | grep -v ^$

С помощью принятого ответа здесь и принятого ответа выше, я использовал:

Это охватывает все основы и отлично работает для моих нужд. Слава оригинальным постерам @Kent и @kev

Ты можешь сказать:

.. что значит print all lines except the empty one(s) и молчи

Другой вариант без sed , awk , perl и т.д.

strings - печатать строки печатаемых символов в файлах.

Вы можете сделать что-то подобное, используя "grep":

Это работает и в awk.

Скорее всего, вы видите неожиданное поведение, потому что ваш текстовый файл был создан в Windows, поэтому конец строки строки \r\n . Вы можете использовать dos2unix, чтобы преобразовать его в текстовый файл в стиле UNIX перед тем, как запускать sed или использовать

удалить пустые строки независимо от того, есть ли возврат каретки.

Привет, что -r делает флаг, и можно ли его объединить, -i чтобы напрямую изменить файл и избежать печати на экране. Кроме того, я думаю, что эта команда также будет работать как sed -r "/^\r$/d"

Мой bash специфический ответ - рекомендовать для этого использовать perl оператор подстановки с глобальным g флагом шаблона :

Этот ответ иллюстрирует учет наличия или отсутствия пустых строк в них ( [\ ]* ), а также использование | для разделения нескольких поисковых терминов / полей. Протестировано на macOS High Sierra и CentOS 6/7.

Кстати, оригинальный код OP прекрасно sed '/^$/d' $file работает в bash терминале на macOS High Sierra и CentOS 6/7 Linux на высокопроизводительном суперкомпьютерном кластере.

Читайте также: