Ребят, чё то я замотался к концу недели и простую задачку решить не могу, подскажите, у кого есть идеи.
Задача такая.
Есть обычный текстовый файл, в 673000 строк.
Нужно тупо в начале каждой строки поставить точку.
делал через echo и через sed, но получается ересь.
Все пустые строки и повторяющиеся слова убрал sed-ом, а вот точки поставить - что то ни как не соображу.
Кто что предложит?
Всем заранее спасибо.
Простановка точек в начале строки
sed 's/^/\./g' FILE > FILE_WITH_DOTS.txt
Спасибо, брат! помогло!
я забыл экранирующий слеш перед точкой. Пора в отпуск.
После операции разница в размере составила 400 Мб!!!!
Боюсь подумать, что бы было бы, если бы делать это вручную!
я забыл экранирующий слеш перед точкой. Пора в отпуск.
вам обоим пора: слеш тут НЕ НУЖЕН.
[console]$ sed -i*.old 's/^/./' test.txt[/console]
PS: и g не нужно - где вы видели строки, у которых больше одного начала?
(не, такие бывают, но не в таких примитивных задачах. Да и тогда надо gm, а не g)
вам обоим пора: слеш тут НЕ НУЖЕН.
В Linux всегда существует больше одного правильного решения, не правда ли? Я в недостаточной мере знаю sed, поэтому часто срабатывают стереотипы, как, например, с опцией g.
P.S. А так?
sed 's/^/./w new.txt' text.txt
В Linux всегда существует больше одного правильного решения, не правда ли?
угу. но это не совсем правильное решение: в выражении для замены действуют иные правила, и работают иные комбинации символов. С точкой просто повезло. Ну а g оно действительно, ничего не меняет. \l \L \U \u \E \1...\9 \& обрабатываются по другому. Да, ещё \0 \x \o \d. Вроде всё...
sed 's/^/./w new.txt' text.txt
можно и так:
[console]$ sed -n '1h;1!H;${x;s/^/./mgp}'[/console]
:)
(примечание: тут все строчки грузятся в буфер в памяти, а на последней строке обрабатываются все загруженные строчки одной командой. Потому тут без g не обойтись. А ещё - мееедлллеееенннооо. И памяти жрёт.)
можно и так:
[console]$ sed '1h;1!H;$!d;x;s/^/./mg'[/console]
Можно и без sed. У меня shell - tcsh, в нём файл, начинающийся со строки
#считается скриптом на tcsh, так что я не пишу в своих скриптах
#!/bin/tcsh
#!/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.
Пётр.
Не поведусь, но я знаю :o как это сделать на awk oO
Можно и без sed.
Есть обычный текстовый файл, в 673000 строк.
Peter, а теперь сравните sed и ваш скрипт(скорость вашего скрипта будет как минимум в 100(в сто) раз ниже). Да и вообще, шурупы заворачивают отвёрткой. А текст правят текстовым редактором.
(кстати о редакторах: с тем-же успехом можно использовать и не только sed, но и любой другой труЪ редактор, к примеру для vim'а команда будет выглядеть почти как для sed'а. Кроме того, пойдёт и не совсем труЪ, например kate. Но использовать для этого shell... Это уже забивание шурупов отбойным молотком)
Не поведусь, но я знаю huh как это сделать на awk
я тоже знаю. И gawk в чём-то лучше sed, а именно:
1) sed не умеет считать. Вообще. А gawk считает очень хорошо.
2) gawk с лёгкостью работает с полями данных, sed-скрипты для работы с полями чудовищны, и способны свести с ума неподготовленного человека.
Вот только здесь нет ни арифметики, ни полей. В данном случае gawk не нужен.
PS: Peter, вам не кажется, что бюстрее и проще будет
#!/bin/sh
while read s; do
echo ".$s" >>dest_file
done < source_file
Или ваша shell так не умеет?
tcsh так не умеет, он не умеет ещё нескольких вещей, доступных в bash,
но мне нравится tcsh.
Насчёт скорости не знаю, но в этом случае нет надобности редактировать
текст, надо только читать строки, т.е. редактор тут - лишняя сущность.
sed и есть потоковоый редактор, он читает строки одну за другой.
Пётр.