Я должен взять список (загрузки) IP-адресов в этом формате:
134.27.128.0
111.245.48.0
109.21.244.0
и превратить их в этот формат с промежуточным каналом (IP-адреса составлены)
134.27.128.0 | 111.245.48.0 | 109.21.244.0 | 103.22.200.0/22
Я думаю, что это команда поиска и замены, sed
но я не могу заставить ее работать.
shell
text-processing
uselesslinuxman
источник
источник
tr
транслировать новые строки в|
каналы? Как<ipfile tr \\n \| >outfile
?|
Требуется ли пространство вокруг ?<
. Так<mydoc tr \\n \| >mydoc2
. Но это не даст вам места. Для тех, наверное, самое быстрое решениеpaste -d' | ' mydoc /dev/null /dev/null >mydoc2
paste
записывает строки, соответствующие каждому файлу. Без-s
, вы получите количество строк в файле.Ответы:
Использование СЭД, на основе известных SED Однострочники Разъяснения Часть I: : 39. Append линия к другому , если она заканчивается слэшем «\» ( за исключением здесь мы игнорируем часть о обратной косой черты, и заменить
\n
новой строки с требуется|
разделитель):должен производить в
mydoc2
источник
sed 'H;1h;$!d;x;s/\n/ | /g'
является линейным.sed
шаблона 8K; это намного меньше, чем 16 млн.Мне было любопытно посмотреть, как некоторые из них (+ некоторые альтернативы) работают по скорости с довольно большим файлом (по
163MiB
одномуIP
на строку, ~ 13 миллионов строк):Результаты (с
sync; echo 3 > /proc/sys/vm/drop_caches
после каждой команды; я повторил тесты - в обратном порядке - через пару часов, но различия были незначительными; также обратите внимание, что я используюgnu sed
):Steeldriver :
очень медленно. Прервано после двух минут ожидания ... так что никакого результата для этого.
cuonglm :
mikeserv :
Jthill :
Авинаш Радж :
и
val0x00ff :
что значит
184.321s
. Неудивительно, что это в 200 раз медленнее, чем решение mikeserv .Вот несколько других способов использования
awk:
Perl:
xargs:
комбинация голова + паста + тр + кошка:
Если у вас есть
GNU coreutils
и если ваш список IP-адресов не очень большой (скажем, до 50000 IP-адресов), вы также можете сделать это с помощьюpr
:где
например, для файла из 6 строк:
команда:
выходы:
источник
while ... read
цикла? Мне любопытно посмотреть, что означает 163kread()
иwrite()
звонки в тесте. Отличный ответ, кстати.sed
кажется, улучшилось его положение в то время (и, вероятно, было только несколько изменений в его движке регулярных выражений), но,grep
похоже, резко отстали в его производительности (особенно для более длинных линий) ? Интересно , еслиperl
дополнения к его двигателю имеют какое - либо отношение этих результатов ... Это также аккуратное , чтоdash
не бездонные .bash
Здесь, вероятно , будет гораздо медленнее , ж / общийIFS=
предваряется.lex
правильно использовать .Вы можете использовать awk :
ORS=' | '
установить выходной разделитель записей , чтобы' | '
вместо новой строки.или отредактируйте на месте с помощью
perl
:источник
paste
работает. очень признателен.paste
решение является самым быстрым.ORS=""
внутриEND
блока,ORS="\n"
чтобы он сделал.Так что я все понял неправильно - и этот вопрос многому меня научил
paste
. Как правильно замечает cuonglm, если вы не входитеpaste
в файл в-s
erial, вы всегда будете\n
получать последнюю строку из вашего infile-списка, добавляемую к выводу в том виде, в котором она написана. Я ошибался, полагая, чтоpaste -s
поведение было его режимом по умолчанию - и это заблуждение, которое, по-видимому,busybox
paste
был рад подкрепить. Следующая команда работает как объявлено сbusybox
:Это не работает в соответствии со спецификацией, хотя. Правильно реализованное действие
paste
все равно добавит завершающий\n
ewline для каждой написанной последовательности. Тем не менее, в этом нет ничего особенного:источник
pr
в виду, но, видимо, он исчерпал себя с огромными входными файлами, поэтому я не мог на самом деле проверить скорость, но с файлами разумной длины это работает нормально. Ваше решение на сегодняшний день является самым быстрым (не удивительно -paste
действительно быстро), см. Мой пост.однострочник с tr и sed:
источник
Использовать
vim
:Объяснение:
-n
отключить файл подкачки-u NONE
используется для пропуска всех инициализаций.-c {command}
выполнять команды после прочтения файла.1,$-1s/\n/ | /g
iss/\n/ | /g
(заменить символ новой строки пробелом пробела) для диапазона1,$-1s
(с 1-й строки до последней строки - 1)wq!
заставить писать и выйтиЗамечания:
В зависимости от того, насколько большой ваш файл на самом деле, это может быть плохой идеей.
источник
Через питона.
пробелы раньше
print
были очень важны.источник
Вот еще один, использующий
xxd
источник
Для полноты картины, вот еще одно
awk
решение, основанное на этом, которое вообще не используетORS
:Для объяснения см. Мой пост на /unix//a/338121/117599 .
источник