Удалите пробелы и нумерацию в списке слов с помощью sed

Вопрос или проблема

У меня есть файл со следующим примером содержимого:

  2 jordyt
  2 dawder
  2 LOL12345
  2 2251084185
  2 123456789
  1 canada
  1 buddy123
  1 bagdad
  1 baba01
  1 124050
  1 123windi
  1 123456789m
  1 123321

Цель состоит в том, чтобы удалить пробелы и цифры в начале, чтобы остались только пароли, так:

jordyt
dawder
LOL12345
2251084185
123456789
canada
buddy123
bagdad
baba01
124050
123windi
123456789m
123321

Я использовал эту команду, но она не работает так, как я хотел:

cat file.txt | sed 's/^\s+\d+\s+//g'

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

И кстати. Почему моя команда не работает?

Ваша команда sed не работает, потому что sed не понимает расширения \s и \d из perl regex.

Вам нужно указать классы символов в старой длинной форме.

Также не нужно использовать cat.

sed -E 's/^[[:space:]]+[[:digit:]]+[[:space:]]+//g' file.txt > file-new2.txt

Кроме того, используйте awk:

awk '{print $2}' file.txt > file-new.txt

Различия по времени выполнения:

$ time awk '{print $2}' file.txt > file-new.txt

real    0m0.007s
user    0m0.000s
sys 0m0.008s

$ time sed 's/^[[:space:]]+[[:digit:]]+[[:space:]]+//g' file.txt > file-new2.txt

real    0m0.006s
user    0m0.001s
sys 0m0.005s

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

Ответ или решение

Конечно! Понимание работы командных инструментов как sed и awk для обработки текстовых данных является важной частью ИТ-этой компетенции. Давайте разберем задачу, о которой идет речь, с детальным объяснением каждого элемента.

Теория (Theory)

Задача заключается в удалении начальных пробелов и чисел из строк файла, чтобы остались только "пароли" или текстовая информация после числа. В данном случае, файл содержит строки с форматированием: <число> <пробелы> <текст>. Например:

  2 jordyt
  2 dawder
  2 LOL12345

Цель состоит в преобразовании таких строк в:

jordyt
dawder
LOL12345

Почему изначальная команда не работает:

  1. Использование \s и \d: Эти выражения являются частью синтаксиса регулярных выражений в Perl, но не поддерживаются стандартной утилитой sed, используемой в UNIX/Linux.

    • \s — обозначает пробел.
    • \d — обозначает цифру.
  2. Неправильное использование флага g: Этот флаг в sed нужен для замены всех вхождений шаблона в строке, но в данной задаче это не требуется, так как мы заменяем только начало строки.

Пример (Example)

Использование sed и awk — подходы для решения задачи:

Правильная команда sed:

sed -E 's/^[[:space:]]+[[:digit:]]+[[:space:]]+//' file.txt > file-new.txt
  • -E (или -r в некоторых UNIX-системах) активирует расширенные регулярные выражения.
  • ^[[:space:]]+ обозначает один или более пробелов в начале строки.
  • [[:digit:]]+ обозначает один или более цифр.
  • Еще раз [[:space:]]+ для последующих пробелов.
  • Знак замены (s/...//) оставляет пустую строку, effectively удаляя совпадение.

Команда awk:

awk '{print $2}' file.txt > file-new.txt
  • $2 указывает, что мы выбираем второй аргумент в строке, разделенной пробелами или другими разделителями (по умолчанию awk использует пробелы и табуляции в качестве разделителей).

Применение (Application)

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

  1. Производительность:

    • awk, как правило, немного быстрее для простых задач по извлечению данных из форматированных строк.
    • sed подходит для сложных манипуляций над строками, но в данном случае его использование оправдано только, если структура входных данных может измениться (например, если числа могут быть не только в начале строки, или формат строк может измениться).
  2. Простота и поддерживаемость:

    • awk может быть проще для понимания для людей, которые только начинают работать с текстовыми потоками.
    • sed, в свою очередь, предлагает больше гибкости для сложной обработки текста.
  3. Масштабируемость:

    • Если предстоит обрабатывать очень большие файлы, стоит протестировать оба метода с минимальным замерением времени выполнения, чтобы выбрать оптимальный вариант.

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

Оцените материал
Добавить комментарий

Капча загружается...