Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: ntz_reloaded 24 Října 2011, 12:15:44

Název: sort|uniq pro cast radku
Přispěvatel: ntz_reloaded 24 Října 2011, 12:15:44
cau ..

dopr .. muzete nekdo pomoci malemu bezradnemu jelitku ?

nejsem schopen vypsat ze souboru za pomoci sort|grep|uniq (POSIX compliant) lajny ktere maj *multipl vyskyt v poli 0 (nebo 1 - podle toho jak indexujeme) .. oddelovac je v tomto pripade "|" (klasicke .csw)

Kód: (priklad) [Vybrat]
# grep 140689 patchdiag.xref
140689|01|Jul/22/09| | |O| B|Unbundled|||Obsoleted by: 140689-02 WITHDRAWN PATCH Hardware/PROM: Sun Blade 2
140689|02|Feb/09/10| | | |  |Unbundled|||Hardware/PROM: Sun Blade 2500 Silver Flash PROM Update

file stahnete zde: https://getupdates.oracle.com/reports/patchdiag.xref

diky, ntz

ad.napoveda)

Kód: [Vybrat]
sort -t '|' -k 1 patchdiag.xref^^ sesortuje file podle prvniho pole

Kód: [Vybrat]
$foo | uniq -d^^ vypise lajny jen pokud je dalsi vyskyt - takze vyhodi vsechny co nemaji duplicitu

ad.reseni) umel bych to vyresit - a dokonce uz to mam vyreseno - brainfuckem v perlu ale rad bych znal reseni *zakladnimi nastroji
Název: Re:sort|uniq pro cast radku
Přispěvatel: ntz_reloaded 24 Října 2011, 12:44:55
pokud nechcete stahovat ten fajl tak tady je *sample input:

Kód: [Vybrat]
# printf "%s\n" a\|x b\|x c\|y a\|z d\|x c\|z
a|x
b|x
c|y
a|z
d|x
c|z

# printf "%s\n" a\|x b\|x c\|y a\|z d\|x c\|z | sort -t\| -k1
a|x
a|z
b|x
c|y
c|z
d|x
Název: Re:sort|uniq pro cast radku
Přispěvatel: ntz_reloaded 24 Října 2011, 16:23:55
hmm. ja kdyz se na neco zeptam tak mi nikdo neporadi .... pokud na to ale nekdo prijde za pomoci standardnich nastroju necht to napise ..

vyreseno v perlu:

Kód: [Vybrat]
#!/usr/bin/perl

## input https://getupdates.oracle.com/reports/patchdiag.xref

use strict;
use warnings;

my %o_hash;

while(<>) {
    chomp;
    next if !/^\d/;
    my($id, $rev, @sline) = split /\|/;
    $o_hash{$id}{$rev} = [ @sline ];
};

for my $id (keys %o_hash) {
    if(keys(%{ $o_hash{$id} }) > 1) {
        for my $rev (keys(%{ $o_hash{$id} })) {
            print join("|", $id, $rev, @{ $o_hash{$id}{$rev} }), "\n";
        };
    };
};

exit 0;
Název: Re:sort|uniq pro cast radku
Přispěvatel: GdH 24 Října 2011, 16:31:57
S mými chabými znalostmi bych na to šel asi takto:
Kód: [Vybrat]
sed 's/|.*//g' patchdiag.xref| sort | uniq -d| while read line; do grep "^$line" patchdiag.xref; done
ale nejsem si jist, zda je to zrovna nejelegantnější řešení..
Název: Re:sort|uniq pro cast radku
Přispěvatel: GdH 25 Října 2011, 01:58:35
Je to zajímavé cvičení, tak jsem to chvíli zkoumal. V tomto konkrétním případě jsem našel jako nejrychlejší následující:

Kód: [Vybrat]
sort -t\| -k1 patchdiag.xref| uniq -Dw 6| grep -v ^##
A nic si z toho nedělej, že ti nikdo neporadí, ber to tak, že tu není nikdo chytřejší, než ty ;)
Název: Re:sort|uniq pro cast radku
Přispěvatel: ntz_reloaded 25 Října 2011, 12:15:12
diky !! to funguje .. sice jen v linuxu ale alespon ze tak ;)
Název: Re:sort|uniq pro cast radku
Přispěvatel: GdH 25 Října 2011, 12:35:32
A které to řešení jsi vybral? A co vlasně brání použití jinde? Jen jsem zvědavý a POSIXem moc nepostižený.
Název: Re:sort|uniq pro cast radku
Přispěvatel: ntz_reloaded 25 Října 2011, 12:50:51
Kód: [Vybrat]
# sort -t\| -k1 patchdiag.xref| uniq -Dw 6| grep -v ^##
uniq: illegal option -- D
Usage:  uniq [-c|-d|-u][-f fields][-s char] [input_file [output_file]]
Or:     uniq [-c|-d|-u][-n][+m] [input_file [output_file]]

jinak zustavam u sveho perl reseni kdyz uz jsem ho sesmolil .. ale diky za to tvoje .. to klidne pouziju v linuxu priste
Název: Re:sort|uniq pro cast radku
Přispěvatel: GdH 25 Října 2011, 13:53:32
V manuálu k GNU uniq ty POSIXové volby nejsou označeny, tak jsem si nebyl jist.
Název: Re:sort|uniq pro cast radku
Přispěvatel: ntz_reloaded 25 Října 2011, 13:56:52
no ja osobne bych udelal neco jako

/usr/posix tree, kterej by obsahoval (bin, etc, share, ..) verze zakladnich utilit v posixu