Portál AbcLinuxu, 10. května 2025 02:39

Dotaz: jak na spojení (některých) řádků

23.12.2017 10:40 hajoucha | skóre: 22
jak na spojení (některých) řádků
Přečteno: 407×
Odpovědět | Admin
Ahojda, chci provést s řádky textového souboru následující operaci:

"řádky, které nezačínají číslem připoj k předchozímu řádku"

Příklad vstupu:
1
nec
prase
3 a
fuj
4 b
výstup má být:
1 nec prase
3 a fuj
4 b
Zatím to umím zařídit pouze pomocí vim:

vim -c ":g/^\D/-1 norm gJ"

bohužel tímto způsobem skončím s otevřeným vim v terminálu, což je nežádoucí. Rád bych tu operaci prováděl ve skriptu. V zásadě by mi i stačilo jenom nějak (automaticky) uložit soubor a zavřít to vim...

Řešení dotazu:


Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.12.2017 10:48 hajoucha | skóre: 22
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Odpovědět | | Sbalit | Link | Blokovat | Admin
hmm, tak vlastně stačí

vim -c ":g/^\D/-1 norm gJ" -c ":wq" soubor.txt

Funguje to, ale moc elegantní mi to teda nepřijde...
23.12.2017 12:29 NN
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Odpovědět | | Sbalit | Link | Blokovat | Admin
cat in.txt | tr '\n' ' ' | grep -oP '\d+[ a-z]+' | sed 's/ $//'
Az na ty mezery na konci..
23.12.2017 12:47 toto awk
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
"Az na ty mezery na konci.. "

tak ich este odstran
23.12.2017 12:50 aaaa
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Nefunguje, vstup
1 2 3
nec
prase
3 a
fuj
4 b

vrati
1
2
3 nec prase
3 a fuj
4 b

Co nesplna zadanie na spajanie riadkov.
23.12.2017 12:40 toto awk
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Odpovědět | | Sbalit | Link | Blokovat | Admin
cat subor.txt | awk '{ stav=0;if (match($1,/^[0-9]+$/)) {if(slov==0){printf $0 }else{printf "\n" $0} } else {printf " "$1};slov++} END {printf "\n"}'
23.12.2017 12:44 toto awk
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
alebo: cat s | awk '{ if (match($1,/^[0-9]+$/)) {if(slov==0){printf $0 }else{printf "\n" $0} } else {printf " "$1};slov++} END {printf "\n"}'
23.12.2017 13:10 aaaa
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Alebo intuitivne cat s | awk 'BEGIN{ORS=""}/^[0-9]/{print have (NR>1?"\n":""); have = $0}/^[^0-9]/{have = have " " $0}END{print have "\n"}'
23.12.2017 13:10 aaaa
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Alebo intuitivne
cat s | awk 'BEGIN{ORS=""}/^[0-9]/{print have (NR>1?"\n":""); have = $0}/^[^0-9]/{have = have " " $0}END{print have "\n"}'
23.12.2017 14:09 awk
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Pri vstupe:

gdsdfs sfd 5 sfda

skonci chybou. Musis ist cez pomocnu premennu.
23.12.2017 16:17 aaaa
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Mne to da rovnaky vystup ako tvoj program. Mozes postnut vystup a porovnat to?
26.12.2017 10:58 awk
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
sorry, ignoruj tento koment
28.12.2017 18:04 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků

Technická poznámka: Na ABCLinuxu není žádné ocenění za UUOC, proto nemá smysl o něj tolik usilovat. :-)

Řešení 1× (hajoucha (tazatel))
wamba avatar 23.12.2017 12:45 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pomocí regexp:
…|perl -00 -pe 's/ \n (?! \d ) / /xg'
nahradí všechny nové řádky, které nejsou před číslem, za mezeru
This would have been so hard to fix when you don't know that there is in fact an easy fix.
23.12.2017 12:49 toto awk
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
nieco@nieco:/tmp$ cat text.txt|perl -00 -pe 's/ \n (?! \d ) / /xg'
1 nec prase
3 a fuj
4 b nieco@nieco:/tmp$ 
23.12.2017 13:03 hajoucha | skóre: 22
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
tohle vypadá dobře! Díky
23.12.2017 13:56 awk
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Praveze tam vsetko dobre neni. Vid posledny riadok.
23.12.2017 14:10 awk
Rozbalit Rozbalit vše Re: jak na spojení (některých) řádků
Privada medzeru naviac.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.