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 есть.
Но синтаксис достаточно своеобразный, и если разовая задача - легче действительно на пхп набросать и на пережевывание отдать, чай пойти пить icon_smile.gif
цитата
16/01/14 в 14:26
 XiVa
Цитата:
XiVa: Как мне кажется php немного для других целей создавался.


Да не пох. ли, для чего он создавался, тебе шашечки или ехать? icon_smile.gif Читай из файла построчно, пиши лог, чтобы в случае перезагрузки не с начала стартовать и все, сойдет любой шаред хостинг.
цитата
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....}
валяй-валяй, изучай - неужто думаешь предки дурнее нас были и с подобными задачами не сталкивались, с перетусовкой-переделкой полей в простом текстовом файле ?? icon_smile.gif
потомки обленились, дай сразу готовый рецепт для андроида - а чуть подумать и сгруппировать комманды в поток..
цитата
16/01/14 в 18:48
 S_Flash
dm: Я когда увидел твой набор дисков с OS Linux сразу понял, что для тебя нет ничего невозможного в консоли! icon_smile.gif
Дай, хоть на чуток расслабиться! icon_smile.gif
Пошёл учить awk ... smail102.gif
цитата
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
О !
стоило чуть подначить icon_smile.gif
цитата
17/01/14 в 13:08
 Smarty
Дада. Чуть подрочить всегда стоит icon_cool.gif
цитата
17/01/14 в 18:09
 dm
ну, у кого что болит..
"жениться вам надо, барин" (c)
и с классиками русской литературы - не спорь icon_smile.gif


Эта страница в полной версии