Portál AbcLinuxu, 5. května 2025 03:00
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)) = 0Tuší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.
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.
{ i = $1 gsub(/:/, "", i) lines[i] = lines[i] $0 " " } END { for (i in lines) { print lines[i] } }
awk '{if($1 in a){print a[$1]""$0;delete a[$1];}a[$1]=$0}' vstup
{ 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.
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)}'
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
unfinished ...
a open resumed
vyskytuje ?
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}'
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
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.