LinuxForum.Fans
Тема

Простановка точек в начале строки

Автор: Vadimsky 11 сообщений 3005 просмотров
#105943

Ребят, чё то я замотался к концу недели и простую задачку решить не могу, подскажите, у кого есть идеи.
Задача такая.
Есть обычный текстовый файл, в 673000 строк.
Нужно тупо в начале каждой строки поставить точку.
делал через echo и через sed, но получается ересь.
Все пустые строки и повторяющиеся слова убрал sed-ом, а вот точки поставить - что то ни как не соображу.
Кто что предложит?
Всем заранее спасибо.

#105944
text

 sed 's/^/\./g' FILE > FILE_WITH_DOTS.txt
#105947

Спасибо, брат! помогло!
я забыл экранирующий слеш перед точкой. Пора в отпуск.
После операции разница в размере составила 400 Мб!!!!
Боюсь подумать, что бы было бы, если бы делать это вручную!

#105952
Vadimsky написал:
я забыл экранирующий слеш перед точкой. Пора в отпуск.

вам обоим пора: слеш тут НЕ НУЖЕН.

[console]$ sed -i*.old 's/^/./' test.txt[/console]

PS: и g не нужно - где вы видели строки, у которых больше одного начала?
(не, такие бывают, но не в таких примитивных задачах. Да и тогда надо gm, а не g)

#105953
drBatty написал:
вам обоим пора: слеш тут НЕ НУЖЕН.

В Linux всегда существует больше одного правильного решения, не правда ли? Я в недостаточной мере знаю sed, поэтому часто срабатывают стереотипы, как, например, с опцией g.
P.S. А так?

text

sed 's/^/./w new.txt' text.txt
#105967
Lupo Alberto написал:
В Linux всегда существует больше одного правильного решения, не правда ли?

угу. но это не совсем правильное решение: в выражении для замены действуют иные правила, и работают иные комбинации символов. С точкой просто повезло. Ну а g оно действительно, ничего не меняет. \l \L \U \u \E \1...\9 \& обрабатываются по другому. Да, ещё \0 \x \o \d. Вроде всё...

Lupo Alberto написал:
sed 's/^/./w new.txt' text.txt

можно и так:
[console]$ sed -n '1h;1!H;${x;s/^/./mgp}'[/console]
:)

(примечание: тут все строчки грузятся в буфер в памяти, а на последней строке обрабатываются все загруженные строчки одной командой. Потому тут без g не обойтись. А ещё - мееедлллеееенннооо. И памяти жрёт.)

#105968

можно и так:
[console]$ sed '1h;1!H;$!d;x;s/^/./mg'[/console]

#106031

Можно и без sed. У меня shell - tcsh, в нём файл, начинающийся со строки

text
#

считается скриптом на tcsh, так что я не пишу в своих скриптах

text
#!/bin/tcsh
text

#!/bin/tcsh

#./chperiod <filename> < <filename> #./chperiod < <filename> (to chper.out) #rm -f chper.out #touch chper.out rm -f ${1}.new touch ${1}.new while ( 1 ) set nn = "$<" if ( "$nn" == "" ) then break endif #echo ".""$nn" >> chper.out echo ".""$nn" >> ${1}.new end

Однако это может не работать в старых версиях tcsh, например, в ASPLinux 10
после исчерпания файла возвращалась не пустая строка, а символ \0274.

Пётр.

#106033

Не поведусь, но я знаю :o как это сделать на awk oO

#106052
Peter написал:
Можно и без sed.
Vadimsky написал:
Есть обычный текстовый файл, в 673000 строк.

Peter, а теперь сравните sed и ваш скрипт(скорость вашего скрипта будет как минимум в 100(в сто) раз ниже). Да и вообще, шурупы заворачивают отвёрткой. А текст правят текстовым редактором.

(кстати о редакторах: с тем-же успехом можно использовать и не только sed, но и любой другой труЪ редактор, к примеру для vim'а команда будет выглядеть почти как для sed'а. Кроме того, пойдёт и не совсем труЪ, например kate. Но использовать для этого shell... Это уже забивание шурупов отбойным молотком)

Lupo Alberto написал:
Не поведусь, но я знаю huh как это сделать на awk

я тоже знаю. И gawk в чём-то лучше sed, а именно:
1) sed не умеет считать. Вообще. А gawk считает очень хорошо.
2) gawk с лёгкостью работает с полями данных, sed-скрипты для работы с полями чудовищны, и способны свести с ума неподготовленного человека.

Вот только здесь нет ни арифметики, ни полей. В данном случае gawk не нужен.

PS: Peter, вам не кажется, что бюстрее и проще будет

text
#!/bin/sh

while read s; do echo ".$s" >>dest_file done < source_file

Или ваша shell так не умеет?

#106055

tcsh так не умеет, он не умеет ещё нескольких вещей, доступных в bash,
но мне нравится tcsh.
Насчёт скорости не знаю, но в этом случае нет надобности редактировать
текст, надо только читать строки, т.е. редактор тут - лишняя сущность.
sed и есть потоковоый редактор, он читает строки одну за другой.

Пётр.

Войдите или зарегистрируйтесь, чтобы ответить.