Вопрос или проблема
У меня есть файл со следующим примером содержимого:
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
Почему изначальная команда не работает:
-
Использование
\s
и\d
: Эти выражения являются частью синтаксиса регулярных выражений в Perl, но не поддерживаются стандартной утилитой sed, используемой в UNIX/Linux.\s
— обозначает пробел.\d
— обозначает цифру.
-
Неправильное использование флага
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)
Перед тем как выбрать подходящий метод, важно учитывать объем обрабатываемых данных, поскольку от этого зависит производительность. Вот несколько моментов, на которые следует обратить внимание:
-
Производительность:
awk
, как правило, немного быстрее для простых задач по извлечению данных из форматированных строк.sed
подходит для сложных манипуляций над строками, но в данном случае его использование оправдано только, если структура входных данных может измениться (например, если числа могут быть не только в начале строки, или формат строк может измениться).
-
Простота и поддерживаемость:
awk
может быть проще для понимания для людей, которые только начинают работать с текстовыми потоками.sed
, в свою очередь, предлагает больше гибкости для сложной обработки текста.
-
Масштабируемость:
- Если предстоит обрабатывать очень большие файлы, стоит протестировать оба метода с минимальным замерением времени выполнения, чтобы выбрать оптимальный вариант.
В завершение работы над данным проектом необходимо провести тестирование на разных примерах входных данных, чтобы убедиться, что выбранное решение стабильно и надежно. Воспользовавшись одной из этих команд, вы сможете обработать свои файлы с текстом, удалив номера и пробелы в начале строк, и добиться необходимого результата для дальнейшего использования данных.