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
-
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)
# 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)
sort -t '|' -k 1 patchdiag.xref
^^ sesortuje file podle prvniho pole
$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
-
pokud nechcete stahovat ten fajl tak tady je *sample input:
# 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
-
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:
#!/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;
-
S mými chabými znalostmi bych na to šel asi takto:
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í..
-
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í:
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 ;)
-
diky !! to funguje .. sice jen v linuxu ale alespon ze tak ;)
-
A které to řešení jsi vybral? A co vlasně brání použití jinde? Jen jsem zvědavý a POSIXem moc nepostižený.
-
# 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
-
V manuálu k GNU uniq ty POSIXové volby nejsou označeny, tak jsem si nebyl jist.
-
no ja osobne bych udelal neco jako
/usr/posix tree, kterej by obsahoval (bin, etc, share, ..) verze zakladnich utilit v posixu