LinuxForum.Fans
Тема

Объединить подряд идущие строки попарно

Автор: valet 12 сообщений 7241 просмотров
#260809

Имеется файл цитат в формате:

Цитата.
Автор
...

Вот образец:

Многие многознайки не имеют ума.
Демокрит
Суть дела не в полноте знания, а в полноте разумения.
Демокрит
В духовной жизни, как и в практической жизни, тот, у которого знания держатся, всегда прогрессирует и имеет успех.
У. Джеймс
Образование придает человеку достоинство, да и раб начинает сознавать, что он не рожден для рабства.
Д. Дидро
...

Хотелось бы получить в формате:

Цитата. - Автор

То есть объединить 2 каждые подряд идущие строки в одну, желательно с каким-то разделителем например "-":
То есть для моего примера хотелось бы получить:

Многие многознайки не имеют ума. - Демокрит
Суть дела не в полноте знания, а в полноте разумения. - Демокрит
В духовной жизни, как и в практической жизни, тот, у которого знания держатся, всегда прогрессирует и имеет успех. - У. Джеймс
Образование придает человеку достоинство, да и раб начинает сознавать, что он не рожден для рабства. - Д. Дидро
...

Думаю можно как-то с помощью sed или grep, помогите разобраться.

#260813

Сделал.
Но опубликую здесь, может кому-то пригодится :)

text
sed -n '1~2p' af > texts.txt
sed -n '0~2p' af > autors.txt
paste --delimiters='' texts.txt delimiter autors.txt > aforizm_lines.txt

где
af - файл афоризмов в формате:

Цитата.
Автор
...

delimiter - файл, содержащий только строки " - " в количестве равном количеству строк файла texts.txt и autors.txt (это для объединения).
aforizm_lines.txt - файл в формате:

Цитата. - Автор
#260821

за самостоятельное решение +, ну а теперь как это сделает человек не в 4 часа ночи:
sed 'N;s/\n/ - /' <файл>

#260891

"Fat-Zer" написал:
sed 'N;s/\n/ - /' <файл>
Да, спасибо, ваш способ тоже работает и намного проще )
#260960

Fat-Zer, а как быть с сидом если:

было

text
aaa 1234
aaa 8888
bbb 2344
ccc 1111
aaa 8999

нужно сделать

text
aaa 1234 8888 8999
bbb 2344
ccc 1111
#261043
"moshell" написал:
Fat-Zer, а как быть с сидом если:

сед - через Е пишется.
сначала sort'ом отсортировать, а потом там малость геморройно.... надо смотреть, поддерживает ли сед ссылки назад в регэкспах...
если нет, то тут awk'ом проще должно быть, но я его не знаю...

#261076

наверняка доктор знает рецепт

#261201

Ну раз доктор не хочет проводить ликбез по sed'у
написал быдло скрипт, сильно не пинать. я только учусь :)
в качестве разделителей выбрал ";"

Показать
esernar@spbmas1> cat file
abcd 111 222 333 444
dddd 777 777 777 777
abcd kkk kkk kkk kkk
cccc 123 123 123 123
bbbb aaa aaa aaa aaa
abcd 000 iii ccc xxx
dddd 789 xhz aa9 98q
cccc ii2 oki dfj dji
zzzz 345 667 789 446
esernar@spbmas1> cat vlookup_all.scr
#!/bin/bash

#analog vlookup M$ Excel
#file - source file

sort file > TMPFILE
bla=`cat file | wc -l`

until [[ "$bla" -eq "0" ]]; do

head=`tail -1 TMPFILE | awk '{print $1}'`
one=`tail -1 TMPFILE`
line=`grep "^$head" TMPFILE | wc -l`
if [[ "$line" -ne "1" ]];then
string=`grep "^$head" TMPFILE | sed -e 's/^[a-zA-Z]*//' | tr -s "\n" ";"`
echo "$head$string" >> newfile
else
echo "$one" >> newfile
fi

grep -v "^$head" TMPFILE > tmpfile
bla=`grep -v "^$head" TMPFILE | wc -l`
cat tmpfile > TMPFILE

done

sed -e 's/;$//' newfile > supernewfile
rm newfile
rm TMPFILE
rm tmpfile

exit 0
esernar@spbmas1> ./vlookup_all.scr
esernar@spbmas1> cat supernewfile
zzzz 345 667 789 446
dddd 777 777 777 777; 789 xhz aa9 98q
cccc 123 123 123 123; ii2 oki dfj dji
bbbb aaa aaa aaa aaa
abcd 000 iii ccc xxx; 111 222 333 444; kkk kkk kkk kkk
esernar@spbmas1>
#261241
Показать
moshell написал:
Ну раз доктор не хочет проводить ликбез по sed'у
написал быдло скрипт, сильно не пинать. я только учусь :)
в качестве разделителей выбрал ";"

esernar@spbmas1> cat file
abcd 111 222 333 444
dddd 777 777 777 777
abcd kkk kkk kkk kkk
cccc 123 123 123 123
bbbb aaa aaa aaa aaa
abcd 000 iii ccc xxx
dddd 789 xhz aa9 98q
cccc ii2 oki dfj dji
zzzz 345 667 789 446
esernar@spbmas1> cat vlookup_all.scr
#!/bin/bash

#analog vlookup M$ Excel
#file - source file

sort file > TMPFILE
bla=`cat file | wc -l`

until [[ "$bla" -eq "0" ]]; do

head=`tail -1 TMPFILE | awk '{print $1}'`
one=`tail -1 TMPFILE`
line=`grep "^$head" TMPFILE | wc -l`
if [[ "$line" -ne "1" ]];then
string=`grep "^$head" TMPFILE | sed -e 's/^[a-zA-Z]*//' | tr -s "\n" ";"`
echo "$head$string" >> newfile
else
echo "$one" >> newfile
fi

grep -v "^$head" TMPFILE > tmpfile
bla=`grep -v "^$head" TMPFILE | wc -l`
cat tmpfile > TMPFILE

done

sed -e 's/;$//' newfile > supernewfile
rm newfile
rm TMPFILE
rm tmpfile

exit 0
esernar@spbmas1> ./vlookup_all.scr
esernar@spbmas1> cat supernewfile
zzzz 345 667 789 446
dddd 777 777 777 777; 789 xhz aa9 98q
cccc 123 123 123 123; ii2 oki dfj dji
bbbb aaa aaa aaa aaa
abcd 000 iii ccc xxx; 111 222 333 444; kkk kkk kkk kkk
esernar@spbmas1>

Не, ну уже даже у меня попроще будет :) многа букафф

#261253
Показать
valet написал:
[quote=moshell]Ну раз доктор не хочет проводить ликбез по sed'у
написал быдло скрипт, сильно не пинать. я только учусь :)
в качестве разделителей выбрал ";"

esernar@spbmas1> cat file
abcd 111 222 333 444
dddd 777 777 777 777
abcd kkk kkk kkk kkk
cccc 123 123 123 123
bbbb aaa aaa aaa aaa
abcd 000 iii ccc xxx
dddd 789 xhz aa9 98q
cccc ii2 oki dfj dji
zzzz 345 667 789 446
esernar@spbmas1> cat vlookup_all.scr
#!/bin/bash

#analog vlookup M$ Excel
#file - source file

sort file > TMPFILE
bla=`cat file | wc -l`

until [[ "$bla" -eq "0" ]]; do

head=`tail -1 TMPFILE | awk '{print $1}'`
one=`tail -1 TMPFILE`
line=`grep "^$head" TMPFILE | wc -l`
if [[ "$line" -ne "1" ]];then
string=`grep "^$head" TMPFILE | sed -e 's/^[a-zA-Z]*//' | tr -s "\n" ";"`
echo "$head$string" >> newfile
else
echo "$one" >> newfile
fi

grep -v "^$head" TMPFILE > tmpfile
bla=`grep -v "^$head" TMPFILE | wc -l`
cat tmpfile > TMPFILE

done

sed -e 's/;$//' newfile > supernewfile
rm newfile
rm TMPFILE
rm tmpfile

exit 0
esernar@spbmas1> ./vlookup_all.scr
esernar@spbmas1> cat supernewfile
zzzz 345 667 789 446
dddd 777 777 777 777; 789 xhz aa9 98q
cccc 123 123 123 123; ii2 oki dfj dji
bbbb aaa aaa aaa aaa
abcd 000 iii ccc xxx; 111 222 333 444; kkk kkk kkk kkk
esernar@spbmas1>

Не, ну уже даже у меня попроще будет :) многа букафф[/quote]

ну так в студию. будем работу над ошибками проводить)

#261280

Я тогда тоже потренируюсь быдлокодить :P

text
#!/usr/bin/env python
#-*- coding: utf-8 -*-
f = open('file','r')
stock = {}
for line in f.readlines():
    stock[line.split()[0]] = stock.get(line.split()[0],[]) + line.split()[1:]
f = open('file_sorted', 'w')
for key in stock:
    f.write(key+str(stock[key])+'\n')
Войдите или зарегистрируйтесь, чтобы ответить.