Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: sort|uniq pro cast radku  (Přečteno 1735 krát)

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
sort|uniq pro cast radku
« kdy: 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
« Poslední změna: 24 Října 2011, 12:30:46 od ntz_reloaded »
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re:sort|uniq pro cast radku
« Odpověď #1 kdy: 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
« Poslední změna: 24 Října 2011, 12:48:06 od ntz_reloaded »
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re:sort|uniq pro cast radku
« Odpověď #2 kdy: 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;
« Poslední změna: 24 Října 2011, 16:28:16 od ntz_reloaded »
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:sort|uniq pro cast radku
« Odpověď #3 kdy: 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í..

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:sort|uniq pro cast radku
« Odpověď #4 kdy: 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 ;)

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re:sort|uniq pro cast radku
« Odpověď #5 kdy: 25 Října 2011, 12:15:12 »
diky !! to funguje .. sice jen v linuxu ale alespon ze tak ;)
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:sort|uniq pro cast radku
« Odpověď #6 kdy: 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ý.

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re:sort|uniq pro cast radku
« Odpověď #7 kdy: 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
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3176
    • GdH-Notes
Re:sort|uniq pro cast radku
« Odpověď #8 kdy: 25 Října 2011, 13:53:32 »
V manuálu k GNU uniq ty POSIXové volby nejsou označeny, tak jsem si nebyl jist.

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re:sort|uniq pro cast radku
« Odpověď #9 kdy: 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
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

 

Provoz zaštiťuje spolek OpenAlt.