Portál AbcLinuxu, 6. května 2025 16:14

Dotaz: odstraneni "temer" dupllicitniho radku

25.1.2008 10:01 Cejvik | skóre: 5
odstraneni "temer" dupllicitniho radku
Přečteno: 367×
Odpovědět | Admin
Zdravim, potreboval bych z textoveho souboru odstanit nejkratsi duplicitni radek a na konci doplnit lomitko, napr.

grafika\2003\Fotoarchiv grafika\2003\Fotoarchiv\akce grafika\2003\Fotoarchiv\akce\03-11-13_praha

aby zbylo jen grafika\2003\Fotoarchiv\akce\03-11-13_praha\
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.1.2008 10:03 Cejvik | skóre: 5
Rozbalit Rozbalit vše Re: odstraneni "temer" dupllicitniho radku
Odpovědět | | Sbalit | Link | Blokovat | Admin
ajaj, tak znovu text
grafika\2003\Fotoarchiv
grafika\2003\Fotoarchiv\akce
grafika\2003\Fotoarchiv\akce\03-11-13_praha
25.1.2008 12:01 ams
Rozbalit Rozbalit vše Re: odstraneni "temer" dupllicitniho radku
Odpovědět | | Sbalit | Link | Blokovat | Admin
Kolik takovych radku muze byt v souboru? Jsou nejak usporadany? Tato informace muze znacne zjednodusit reseni. Zatim navrhuji takovy kod v Perlu:
#!/usr/bin/perl
while(<>){
        chomp; @F=split/\\/; s/'/\\'/g for @F; $f=pop@F; 
        $e=@F?'$h{\''.join('\'}{\'',@F).'\'}':'$h'; 
        $e.="={\'$f\'=>1}";
        eval$e;
}
        
sub p{
        while(($k,$v)=each %{$_[0]}){
                print "$k\\";
                if(ref$v) { p($v) } else { print "\n" };
        }
}

p(\%h)
30.1.2008 09:51 Cejvik | skóre: 5
Rozbalit Rozbalit vše Re: odstraneni "temer" dupllicitniho radku
Zkusil jsem testovaci soubour, který obsahoval
2007\Akce
2007\Akce\2007
2007\Akce\2007\pozvanky
2007\Akce\2007\pozvanky\English
2007\Akce\2007\DIPLOMY
2007\Akce\2007\DIPLOMY\bodyfitness
2007\Akce\2007\DIPLOMY\fitness
2007\Akce\2007\bannery
2007\Akce\2007\bannery\molo
2007\Akce\2007\bannery\vchod
ale dostal jsem misto ocekavaneho
2007\Akce\2007\pozvanky\English
2007\Akce\2007\DIPLOMY\bodyfitness
2007\Akce\2007\DIPLOMY\fitness
2007\Akce\2007\bannery\molo
2007\Akce\2007\bannery\vchod
pouze toto:
2007\Akce\2007\bannery\vchod\
geon avatar 30.1.2008 10:20 geon | skóre: 18 | blog: bavaria
Rozbalit Rozbalit vše Re: odstraneni "temer" dupllicitniho radku
Nerad píši hotové scripty, ale občas to také potřebuji, tak tady je řešení v Pythonu. Lomítka na konci a případné načítání ze souboru si snad doděláš sám ;-)
# -*- coding: utf-8 -*- 

radky = r"""2007\Akce
2007\Akce\2007
2007\Akce\2007\pozvanky
2007\Akce\2007\pozvanky\English
2007\Akce\2007\DIPLOMY
2007\Akce\2007\DIPLOMY\bodyfitness
2007\Akce\2007\DIPLOMY\fitness
2007\Akce\2007\bannery
2007\Akce\2007\bannery\molo
2007\Akce\2007\bannery\vchod"""

seznam=[]

for radek in radky.split("\n"):
    for i in range(len(seznam)):
        if seznam[i] in radek:
            seznam[i] = radek
            break
    else:
        seznam.append(radek)

for radek in seznam:
    print radek
Práce se soubory: http://www.py.cz/PraceSeSoubory
30.1.2008 11:49 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: odstraneni "temer" dupllicitniho radku
my $last = '';
for (sort { $b cmp $a } map { chomp; $_ } <>) {
    print $last = $_, "\n"
      if index $last, $_;
}
30.1.2008 10:24 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: odstraneni "temer" dupllicitniho radku
Odpovědět | | Sbalit | Link | Blokovat | Admin
sort vstup.txt | gawk -f dupl.awk

kde dupl.awk vypadá takhle:

BEGIN {
   predchozi="";
}
{
   if (substr($0,1,length(predchozi))!=predchozi) {
        print predchozi;
   }
   predchozi=$0;
}
END {
  print predchozi;
}
I am always ready to learn although I do not always like to be taught. (W. Churchill)
30.1.2008 12:55 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: odstraneni "temer" dupllicitniho radku
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ha, najnamakanejsi sedovy skript, aky som kedy spravil:
sed -n 'H
    g
    s/^\(.*\)\n\1.*//
    s/\n.*//p
    g
    $s/^\(.*\)\n\1.*//
    $s/.*\n//p
    s/.*\n//
    h' subor.in
(Ak to chce niekto ako one-liner, tak tu:

sed -n 'H; g; s/^\(.*\)\n\1.*//; s/\n.*//p; g; $s/^\(.*\)\n\1.*//; $s/.*\n//p; s/.*\n//; h')

alebo skript v bashi (ktory je ideovo rovnaky):
#!/bin/bash

while read line; do
    [[ "$line" =~ "$prev".* ]] ||
        echo "$prev"
    oldprev="$prev"
    prev="$line"
done

[[ "$prev" =~ "$oldprev".* ]] ||
    echo "$prev"
a volanie:

skript < subor.in
If you hold a Unix shell up to your ear, you can you hear the C.

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.