Portál AbcLinuxu, 5. května 2025 03:00

Dotaz: Spojení řádků označených čísly

20.3.2010 12:15 Pan Mantinel
Spojení řádků označených čísly
Přečteno: 773×
Odpovědět | Admin
Zdravím, měl bych dotaz, vyfiltroval jsem si pomocí grepu řádky obsahující slova unfinished a resumed, výpis vypadá takto:
28135: open("/etc/lib"map.conf3", O_RDONLY, (unfinished ...)
28131: open("/etc/lib"map.conf12", O_RDONLY, (unfinished ...)
28131: (... open resumed)) = 0
28135: (... open resumed)) = -1 ENOENT (No such file or directory)
A potřeboval bych řádky se stejným počátečním číslem spojit do jednoho, aby výstup vypadal takto:
28135: open("/etc/lib"map.conf3", O_RDONLY, (unfinished ...)28135: (... open resumed)) = -1 ENOENT (No such file or directory)
28131: open("/etc/lib"map.conf12", O_RDONLY, (unfinished ...)28131: (... open resumed)) = 0
Tuším způsob, jak to třeba v awk udělat (začít u prvního řádku a porovnávat $1 s ostatními, když se najde shoda, vytisknout), ale vůbec mi nenapadá, jak to nakódit (s awk teprve začínám) a navíc mi tenhle způsob přijde neefektivní a náročný na čas.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.3.2010 12:44 buff | skóre: 10 | blog: buff
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli se celý ten výstup vejde do paměti, tak bych to udělal v perlu:
my %line_pairs;
while (my $line = <>) {
    chomp $line;
    my @fields = split ':', $line;
    my $num = shift @fields;
    $line_pairs{$num} .= join ':', @fields;
}

for my $key (sort keys %line_pairs) {
    print $line_pairs{$key}, "\n";
}
Možná trošku špatně, psáno z hlavy, netestováno.
20.3.2010 12:57 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
Odpovědět | | Sbalit | Link | Blokovat | Admin
AWK řešení, také se text musí vejít do paměti. Testováno :-)
{
	i = $1
	gsub(/:/, "", i)
	lines[i] = lines[i] $0 " "
}

END {
	for (i in lines) {
		print lines[i]
	}
}
kouby avatar 20.3.2010 13:14 kouby | skóre: 27 | blog: init | Praha
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
Odpovědět | | Sbalit | Link | Blokovat | Admin
awk '{if($1 in a){print a[$1]""$0;delete a[$1];}a[$1]=$0}' vstup
That's thirty minutes away. I'll be there in ten.
20.3.2010 13:44 Pan Mantinel
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
Odpovědět | | Sbalit | Link | Blokovat | Admin
Díky moc všem, už mi to trochu objasnilo, jak se vlastně s awk a perlem pracuje. Zatím mi na na první pohled na pochopení přijdou nejjednodušší obě řešení v awk, takže zkusím pořádně pochopit ty.
20.3.2010 14:58 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
Jestli se každé číslo řádku objeví právě dvakrát, je koubyho řešení lepší. To moje lze každopádně zjednodušit na
{
	lines[$1] = lines[$1] $0 " "
}

END {
	for (i in lines) {
		print lines[i]
	}
}
Předtím jsem totiž zapomněl, že pole v AWK mohou jako klíče používat libovolné řetězce.
wamba avatar 20.3.2010 15:55 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
jak se vlastně s awk a perlem pracuje.
Chcete si to ozkoušet a pak si vybrat. Mně se třeba pracuje lépe s perlem (je univerzálnějším nástrojem než awk, ale uznávám, že může ze awk může vypadat přehledněji).

Samozřejmě v perlu by to šlo taky napsat zkráceně

perl -ane 'chomp ;$line{$F[0]} .= $_; END{print $_,"\n" foreach values(%line)}'
This would have been so hard to fix when you don't know that there is in fact an easy fix.
20.3.2010 16:32 deadmail
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vo vseobecnosti je najrychlejsie subor najprv utriedit a potom staci porovnavat za sebou iduce riadky. Staci si teda pamatat len rovnako zacinajuce riadky.

sort subor | awk 'NR == 1 {last_id=$1;last=$0} NR > 1 {if ($1 == last_id) {last = last$0} else {print last; last=$0; last_id=$1}} END {print last}'

Ak je subor vysledkom prikazu
grep
, tak uz asi utriedeny je ;-)
25.3.2010 17:19 pluto
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
a ako by sa do takeho vyrazu dala zakomponovat podmienka nech to spaja len riadky v ktorych sa to unfinished ... a open resumed vyskytuje ?
25.3.2010 20:48 deadmail
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
sort subor | awk 'NR == 1 {last_id=$1;last=$0} NR > 1 {if (($1 == last_id) && ($0 ~ "unfinished|open resumed")) {last = last$0} else {print last; last=$0; last_id=$1}} END {print last}'
25.3.2010 22:56 Nonsens
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
ja len tak...funguje aspon jedna moznost? :DD
26.3.2010 09:11 pluto
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
nie uplne ale myslim ze sa to z toho bude dat poskladat :D
27.3.2010 13:35 Nonsens
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
a ktora moznost je asi taka najidealnejsia?
27.3.2010 17:10 hizo
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
ja by som to tiez potreboval a v awk pracovat neviem. takze ak mam riadky: 3733 execve("/bin/ls", ["ls", "/etc/anacrontab", "/etc/blkid.tab", "/etc/crontab", "/etc/crypttab", "/etc/fstab", "/etc/mtab"], [/* 38 vars */] < unfinished ...>
3733 <... execve resumed> ) = 0
3735 execve("/bin/sed", ["sed", "-n", "1p"], [/* 38 vars */] < unfinished ...>
3735 <... execve resumed> ) = 0
mohol by sem niekto napisat riesenie v awk aby mi to spojilo riadky ktore si odpovedaju tymi zaciatocnymi cislami?dakujem
27.3.2010 15:42 hizo
Rozbalit Rozbalit vše Re: Spojení řádků označených čísly
Odpovědět | | Sbalit | Link | Blokovat | Admin
prosim vas a neda sa to spravit cisto sedmi a grepom??ze napriklad cely vypis suboru budem mat ulozeny v premennej a neda sa to par grepmi a sedmi pospajat??

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.