Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Sed
Новая тема
Ответить
цитата
16/01/14 в 01:49
S_Flash
Есть некий дамп:
word1|some_text_
KEY
_some_text_
KEY
_some_text_
KEY
_some...
word2|some_text_
KEY
_some_text_
KEY
_some_text_
KEY
_some...
word3|some_text_
KEY
_some_text_
KEY
_some_text_
KEY
_some...
wordN|some_text_
KEY
_some_text_
KEY
_some_text_
KEY
_some...
Надо в
каждой отдельной
строке заменить все 3 её
KEY
на то слово word1,word2,..wordN, что стоит в начале этой строки! word(n-e) отделяетя символом |, их можно только идентифицировать только как jn началf строки до '|'.
Должно получиться:
word1|some_text_
word1
_some_text_
word1
_some_text_
word1
_some...
word2|some_text_
word2
_some_text_
word2
_some_text_
word2
_some...
...
ПС Еслиб дамп был в пределах 10к, то я бы попробовал справиться обычным редактором, например ST2, но дамп, скажем так, крупнее на порядок! ;)
цитата
16/01/14 в 02:18
Stek
emeditor хоть в гиг дамп откроет. Там же реплейс можно на регулярке построить.
цитата
16/01/14 в 10:10
XiVa
S_Flash писал:
ПС Еслиб дамп был в пределах 10к, то я бы попробовал справиться обычным редактором, например ST2, но дамп, скажем так, крупнее на порядок! ;)
Простенький пхп скрипт сделает это за пару минут.
цитата
16/01/14 в 11:43
S_Flash
Stek писал:
emeditor хоть в гиг дамп откроет. Там же реплейс можно на регулярке построить.
Тут не совсем тривиальный Search and Replace.. В каждой строке индивидуальный replace.
цитата
16/01/14 в 11:49
S_Flash
XiVa:
Как мне кажется php немного для других целей создавался. Локально на винду его как cli вроде как не ставят. В серверном исполнении такой скрипт будет неинтересен, так как будет серьёзно жрать память и иметь огромное, в понимании скрипта, время исполнения. (Т.е. на лету это будет некомильфо). Это типо как ножичком раскручивать ноутбук вместо отвёртки, вроде как шурупы выкручиваются, а рано или поздно понимаешь, что что-то не то! ;)
Будь я на линуксе я бы задействовал лучше баш. Под виндой аналога баша я не знаю. Вот я и подумал, что эту работу красиво и быстро выполнит sed, тем более это его прямое назначение.
цитата
16/01/14 в 11:54
Smarty
Эту операцию разово нужно выполнить или она с какой-то периодичесностью должна быть?
Если разово - то на пыхе тут написать, выполнить и забыть. Если периодически - ну питон к примеру. Меньше памяти будет отъедать.
цитата
16/01/14 в 11:58
dm
Это не для sed..
На
AWK
можно - как раз под него задача, распарсить входные поля, перетусовать-пересчитать-поменять все и потоком же выплюнуть, на построчную скоростную обработку как раз заточен, в любом *nix есть.
Но синтаксис достаточно своеобразный, и если разовая задача - легче действительно на пхп набросать и на пережевывание отдать, чай пойти пить
цитата
16/01/14 в 14:26
XiVa
Цитата:
XiVa: Как мне кажется php немного для других целей создавался.
Да не пох. ли, для чего он создавался, тебе шашечки или ехать?
Читай из файла построчно, пиши лог, чтобы в случае перезагрузки не с начала стартовать и все, сойдет любой шаред хостинг.
цитата
16/01/14 в 15:22
S_Flash
XiVa:
И шашечки и ехать.. Где мне взять сервер с php для единоразовой задачи?
цитата
16/01/14 в 17:27
Оборотень
S_Flash писал:
Есть некий дамп:
word1|some_text_
KEY
_some_text_
KEY
_some_text_
KEY
_some...
word2|some_text_
KEY
_some_text_
KEY
_some_text_
KEY
_some...
word3|some_text_
KEY
_some_text_
KEY
_some_text_
KEY
_some...
wordN|some_text_
KEY
_some_text_
KEY
_some_text_
KEY
_some...
Надо в
каждой отдельной
строке заменить все 3 её
KEY
на то слово word1,word2,..wordN, что стоит в начале этой строки! word(n-e) отделяетя символом |, их можно только идентифицировать только как jn началf строки до '|'.
Должно получиться:
word1|some_text_
word1
_some_text_
word1
_some_text_
word1
_some...
word2|some_text_
word2
_some_text_
word2
_some_text_
word2
_some...
...
ПС Еслиб дамп был в пределах 10к, то я бы попробовал справиться обычным редактором, например ST2, но дамп, скажем так, крупнее на порядок! ;)
KEY одинаковый везде?
цитата
16/01/14 в 17:51
S_Flash
Оборотень писал:
KEY одинаковый везде?
ага и заменить надо в каждой строчке на одинаковое для этой строки
цитата
16/01/14 в 18:34
dm
S_Flash писал:
ага и заменить надо в каждой строчке на одинаковое для этой строки
ну так первое в этой строке и будет $1
awk {$1....}
валяй-валяй, изучай - неужто думаешь предки дурнее нас были и с подобными задачами не сталкивались, с перетусовкой-переделкой полей в простом текстовом файле ??
потомки обленились, дай сразу готовый рецепт для андроида - а чуть подумать и сгруппировать комманды в поток..
цитата
16/01/14 в 18:48
S_Flash
dm:
Я когда увидел твой набор дисков с OS Linux сразу понял, что для тебя нет ничего невозможного в консоли!
Дай, хоть на чуток расслабиться!
Пошёл учить awk ...
цитата
16/01/14 в 20:46
Smarty
<?
$infile = 'in.txt';
$outfile = 'out.txt';
$inarray = file($infile);
$keymask = 'KEY';
$outhandle = fopen($outfile, 'w');
foreach ($inarray as $instring)
fwrite($outhandle, str_ireplace($keymask, substr($instring, 0, stripos($instring, '|')), $instring));
fclose($outhandle);
?>
конечно KEY должен быть уникальным вхождением в каждую строку. иначе лишнего назаменяться может
цитата
16/01/14 в 21:11
Smarty
<?
$infile = 'in.txt';
$outfile = 'out.txt';
$content = file_get_contents($infile);
$keymask = 'KEY';
$gpos = 1;
$newcontent = '';
while($gpos)
{
$fpos = stripos($content, "|", $gpos);
if ($fpos)
{
$wordN = trim(substr($content, $gpos-1, $fpos-$gpos+1));
$lpos = stripos($content, "\n", $fpos);
if (!$lpos)
$lpos = strlen($content);
$sentence = trim(substr($content, $fpos+1, $lpos-$fpos-1));
$newsentence = str_ireplace($keymask, $wordN, $sentence);
$newcontent .= $wordN."|".$newsentence."\n";
$gpos = $lpos;
} else
break;
}
file_put_contents($outfile, $newcontent);
?>
то же самое если не использовать массивы и регулярки. в теории должно отъесть меньше памяти и работать быстрее
цитата
16/01/14 в 23:03
lalex
awk
awk -F'|' 'BEGIN { OFS="|" } { gsub(/KEY/, $1, $2); print $1,$2 }' input.txt
Семок тому, кто напишет на sed.
цитата
17/01/14 в 02:16
st01en
file.txt
Цитата:
word1|some_text_KEY_some_text_KEY_some_text_KEY_some...
word2|some_text_KEY_some_text_KEY_some_text_KEY_some...
word3|some_text_KEY_some_text_KEY_some_text_KEY_some...
sed -i -e 's/\(.*\)\(|.*\)KEY\(.*\)KEY\(.*\)KEY\(.*\)/\1\2\1\3\1\4\1\5/' file.txt
цитата
17/01/14 в 07:32
dm
О !
стоило чуть подначить
цитата
17/01/14 в 13:08
Smarty
Дада. Чуть подрочить всегда стоит
цитата
17/01/14 в 18:09
dm
ну, у кого что болит..
"жениться вам надо, барин" (c)
и с классиками русской литературы - не спорь
Новая тема
Ответить
Эта страница в полной версии