Как удалить строку если дольше, чем XY?

Я выполняю Xubuntu с хорошим успехом на аналогичной системе. Я обычно загружаюсь в fluxbox менеджер окон. Вы не получаете необычный рабочий стол, но он сохраняет много RAM, и это действительно просто в использовании.

Не имейте никаких иллюзий о том, что Вы делаете здесь все же. Я могу сделать больше всего все, что я хочу сделать на этом поле, но оно имеет свои ограничения. Например, если Pandora играет, она не собирается делать намного больше что простые задачи командной строки. Также некоторые файлы pdf могут занять минуты для открытия. RAM является Вашим самым большим ограничением, таким образом, Вы будете вынуждены предположить, если необходимо запустить несколько приложений.

P.S. Я также выполняю TinyCore прочь Карты памяти на 4 ГБ на MacBook Pro, который имеет больше RAM, чтобы быть уверенным, но никакой HD. Это работало бы отлично, но является намного большим количеством стычки.

23
29.01.2014, 19:27
6 ответов
sed '/^.\{2048\}./d' input.txt > output.txt
24
27.01.2020, 19:42
  • 1
    я получаю сообщение об ошибке sed: 1: "/^.\{2048\}..*/d": RE error: invalid repetition count(s) (Mac OS X) –  wedi 13.10.2014, 18:47
  • 2
    @wedi Вы, вероятно, хотите установить версию GNU вместо версии BSD, которая поставлется с Mac. Это легко с варевом –  Freedom_Ben 06.07.2016, 03:00

Вот решение, которое удаляет строки, который имеет 2049 или больше символов:

sed -E '/.{2049}/d' <file.in >file.out

Выражение /.{2049}/d будет соответствовать любой строке, которая содержит по крайней мере 2 049 символов и удаляет их из входа, продолжая только более короткую линию на выводе.

С awk, печать строк длины 2048 или короче:

awk 'length <= 2048' <file.in >file.out

Имитация sed решение буквально с awk:

awk 'length >= 2049 { next } { print }' <file.in >file.out
8
27.01.2020, 19:42
  • 1
    я получаю сообщение об ошибке sed: 1: "/^.\{400,\}$/d": RE error: invalid repetition count(s) (Mac OS X) –  wedi 13.10.2014, 18:47

Что-то вроде этого должно работать в Python.

of = open("orig")
nf = open("new",'w')
for line in of:         
    if len(line) < 2048:
        nf.write(line)
of.close()
nf.close()
3
27.01.2020, 19:42
  • 1
    Лично, @Faheem, я предпочитаю Ваш ответ. Причина, почему то, что для меня было очень легко изменить к лучшему его в, 'удаляет все строки, меньшие, чем x'. Я не использую Python все время, но когда я делаю я всегда чувствую, что должен изучить это хорошо. –  ixtmixilix 22.05.2011, 21:18
  • 2
    @ixtmixilix: Да, использование полнофункционального языка как Python довольно гибко. Спасибо за комментарий. –  Faheem Mitha 24.05.2011, 19:46
perl -lne "length < 2048 && print" infile > outfile
3
27.01.2020, 19:42
  • 1
    +1 -l не необходим, все же. –  Joseph R. 29.01.2014, 19:22
  • 2
    не работает на меня. Perl v5.16.2. Warning: Use of "length" without parentheses is ambiguous at -e line 1. Unterminated <> operator at -e line 1. –  wedi 13.10.2014, 18:51
  • 3
    Можно попробовать length($_) > 2048 && print. length ярлык для length($_) так или иначе. –  MaratC 17.11.2014, 14:10

Приведенные выше ответы не работают для меня на Mac OS X 10.9.5.

Следующий код работает:

SED '/.\ (2048\). /'.

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

SED '/.\ (2048} /!] ..

0
27.01.2020, 19:42

С помощью gnu -sed вы можете использовать флаг -r, чтобы не вводить обратную косую черту, и запятую, чтобы определить открытый интервал:

sed -r  "/.{2049,}/d" input.txt > output.txt

с:

  • x{2049} означает ровно 2049 xs
  • x{2049,3072} означает от 2049 до 3072 xs
  • x{2049,} означает не менее 2049 xs
  • x{,2049} означает не более 2049 xs

Для интервалов, чтобы не совпадать с более крупными шаблонами, вам потребуются линейные привязки, такие как

sed -r  "/^.{32,64}$/d" input.txt > output.txt 
1
27.01.2020, 19:42

Теги

Похожие вопросы