Portál AbcLinuxu, 24. dubna 2024 20:14


Dotaz: Čím najít duplikátní řádky?

28.2.2016 13:56 Mirek
Čím najít duplikátní řádky?
Přečteno: 1306×
Odpovědět | Admin
Rád bych nástroj k nalezení duplikátních řádků, který mi dá možnost vybrat duplikátní řádek ke smazání. Jako test soubor mám
! flora
jetel
len
! fauna
jelen
lev
! nebe
letadlo jelen
tupolev
! dalsi
lentilka
jelenice
jitrnice
jetel
lev

Řešení dotazu:


Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

28.2.2016 14:08 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Odpovědět | | Sbalit | Link | Blokovat | Admin
uniq seznam.txt
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
pavlix avatar 28.2.2016 23:35 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Obávám se, že uniq seznam.txt dá úplně stejný výsledek jako cat seznam.txt.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
29.2.2016 18:02 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
On ten uniq mi stejně nějak divně funguje, když dle tohohle příkladu.
$ cat duplitest.txt 
! flora
jetel
len
! fauna
jelen
lev
! nebe
letadlo jelen
tupolev
! dalsi
lentilka
jelenice
jitrnice
jetel
lev
mi vypíše po
$ uniq -c -w 3 duplitest.txt
      1 ! flora
      1 jetel
      1 len
      1 ! fauna
      1 jelen
      1 lev
      1 ! nebe
      1 letadlo jelen
      1 tupolev
      1 ! dalsi
      1 lentilka
      1 jelenice
      1 jitrnice
      1 jetel
      1 lev
přitom by měl vypsat
$ uniq -c -w 3 duplitest.txt
      2 jet
      2 len
      2 jel
      2 lev
alespoň to tak chápu z toho externího příkladu.
pavlix avatar 29.2.2016 22:39 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Chová se to přesně podle dokumentace.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
Fuky avatar 28.2.2016 14:23 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Odpovědět | | Sbalit | Link | Blokovat | Admin

Vzhledem k tomu, že to chceš dělat interaktivně, tak to lze udělat např. následovně. Uložíš si všechny duplicitní řádky do souboru duplicate.lines:

$ sort input.txt |uniq -d >duplicate.lines

V oblíbeném textovém editoru smažeš ze souboru duplicate.lines řádky, které nechceš odstranit:

$ vim duplicate.lines

Z původního vstupního souboru odfiltruješ všechny řádky, které jsou v souboru duplicate.lines a výstup uložíš do nového souboru new_input.txt:

$ fgrep -vxf duplicate.lines input.txt >new_input.txt

-- RÁMO: psí tábor , ETriatlon: Výuka plavání
28.2.2016 14:34 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Nechci to nijak třídit, zapomněl jsem to uvést. Díky všem za nápady, zatím..
Fuky avatar 28.2.2016 14:44 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Však ve výstupním souboru je zachováno stejné pořadí řádků jako ve vstupním souboru. Jen jsou v něm odstraněny řádky které chceš.
28.2.2016 15:12 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?

Našlo mi to řádky

jetel
lev

ty jsem odstranil, protože jsem je nechtěl smazat dokud mi nedá výběr který duplikátní řádek se mi smaže, nechci smazat vždy jen první nebo vždy jen druhý, chci vědět který se smaže.

Poslední krok mi vrátil původní soubor.

Jendа avatar 28.2.2016 16:09 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Hm, to zní komplikovaně, a asi na to bude potřeba něco naprogramovat… Osobně bych to dělal tak, že bych v Pythonu načetl řádky do dictionary a u každého si pamatoval, kolikrát tam byl, pak bych soubor znova prošel a před každý řádek vypsal číslo z toho dictionary, pak bych to v textovém editoru promazal a pak bych odstranil první sloupec (cut -d " " -f 2-).
29.2.2016 15:13 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Nu dobrá, tak využij získaný soubor duplicate.lines a ulož si do souboru remove.lines všechny řádky s duplicitami a prefixem, který charakteruzuje číslo řádku ve vstupním souboru.
Co když budu mít soubor s tisíci řádky a navíc já se ty duplicity snažím mezi těmi tisíci najít, kdybch věděl které to jsou nepokládal bych zde dotaz. Vážím si ale tvé snahy, jen chybí uvažování jak moc to bude efektivní v souboru s těmi tisíci položkami. Chci říct, že na takový malý soubor je až příliš mnoho interakce ;-)
29.2.2016 15:15 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
http://www.abclinuxu.cz/poradna/linux/show/414063#12
Fuky avatar 28.2.2016 16:54 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?

Nu dobrá, tak využij získaný soubor duplicate.lines a ulož si do souboru remove.lines všechny řádky s duplicitami a prefixem, který charakteruzuje číslo řádku ve vstupním souboru.

$ fgrep -nxf duplicate.lines input.txt >remove.lines

Pak si opět v oblíbeném textovém editoru smaž ze souboru remove.lines řádky, které nechceš odstranit a následně využij tento soubor pro smazání konkrétních řádků ze vstupního souboru:

$ sed -e $(cut -f 1 -d ":" remove.list |sed -e 's/$/d;/' |tr -d "\n") input.txt >new_input.txt

Soubor new_input.txt bude obsahovat výsledek.

Josef Kufner avatar 28.2.2016 14:30 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud chceš zachovat pořadí řádků, nahrej to do SQL databáze, přidej sloupec, který bude značit duplicity a pak můžeš interaktivně mazat libovolným GUI klientem.
Hello world ! Segmentation fault (core dumped)
28.2.2016 14:52 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
nahrej to do SQL databáze

S datábazemi nemám zkušenosti, ale předpokládám, že mám k tomu použít LibreOffice Base a pak ale nevím co dál. Co bych měl hledat v nápovědě abych dosáhl toho co mi radíš.

přidej sloupec, který bude značit duplicity
Dobře nějak vytvořím sloupec ale jak porozumět, že má značit duplicity?
Jendа avatar 28.2.2016 16:05 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Base by asi šlo použít, ale osobně bych k tomu použil SQLite nebo MySQL. K MySQL používám klikátor Adminer.

Duplicity nevím jak označit, tohle by možná mohlo fungovat.
28.2.2016 16:28 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Srandovní na tom je, že v PSPadu (freeware) pro Windows to jde na pár kroků i bez vytváření nějaké databáze, editor to najde s možností interakce bez vytváření nějakých dočasných souborů. On sice funguje i jakžtakž ve Wine ale mám problém s jeho výkonem, proto používám Bluefish ale zdaleka nemá funkčnost PSPadu včetně tohoto.
Jendа avatar 28.2.2016 16:35 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Not my problem.

V tom případě stačilo dát do Googlu "vim find duplicate lines" a kliknout na první odkaz.
28.2.2016 16:55 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
A že jsi to neudělal dříve? Dobrá budu se muset naučit s Vimem když to jinak jednoduše nejde.
28.2.2016 19:15 Jindřich Makovička | skóre: 17
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Frantové uživatelé tyhle věci zpravidla řeší v Excelu a spol...
29.2.2016 15:42 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Taky řešení, ale pro moje účely moc komplikované a zdlouhavé na více položek. Díky ;-)
Josef Kufner avatar 29.2.2016 00:46 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Na takový úkol je celkem jedno, která databáze to bude. Pointa je v tom, že si v jednom sloupečku uchová původní data a do dalšího si nechá spočítat, zda stejný řádek už tam je. A pokud použitá databáze nezachovává pořadí řádků, tak si tam přidá i číslo řádku.
Hello world ! Segmentation fault (core dumped)
pavlix avatar 28.2.2016 23:36 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Pokud chceš zachovat pořadí řádků, nahrej to do SQL databáze
Pobavilo.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
wamba avatar 28.2.2016 17:10 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Odpovědět | | Sbalit | Link | Blokovat | Admin
můžeš si napsat script který ti vypíše text řádků a k nim indexy řádků, kde se nachází, pak vyfiltruješ ty, kde jsou 2 a více indexy, v Perlu 6 třeba takhle:
perl6 -e 'my %rows .= push: lines.pairs.invert; %rows.grep( *.value.elems > 1 )>>.say'
:)
This would have been so hard to fix when you don't know that there is in fact an easy fix.
28.2.2016 17:50 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Budu muset teda počkat na verzi 6, mám jen 5, moc ale díky.
28.2.2016 22:32 RM
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
awk '{print a[$0]++":"$0}' file.txt | tac | awk -v FS=':' '{b[$2]=$1} a[$2]++{b[$2]++} b[$2]==0{b[$2]=""} b[$2]{b[$2]=">:"} {print b[$2]$2}' | tac | awk -v FS=':' '$1==">" && !a[$2]{a[$2]=">"++i">>"} {print $1a[$2]$2}'

Je to trochu delší. Bez požadavku na číslování se dá odstranit poslední Awk.
Řešení 1× (1john2)
29.2.2016 10:57 RM
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Ještě k tomu terminálové omalovátko (max deset barev):

| sed 's#>>\([0-9]\)>>\(.*\)#"\\033[1m\\033[4\1m\2\\033[0m"#' | xargs -I {} printf "{}\\n"
29.2.2016 15:23 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
WoW, to se mi moc líbí ;-) Pro mě solušn #1
29.2.2016 15:49 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
I to bez těch barviček, ale to s tím perlem, mě přijde nepřehlednější, jinak se pokusím porozumět co ty řeťezce v těch vašich příkazech vlastně dělají;-)
1.3.2016 16:20 RM
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Tak jsem to zkoušel na svém .vimrc a koukam, že to havaruje na uvozovkách, které se tam vyskytují jako komentáře. Tož jsem to ještě opravil:

| sed '/^>>[0-9]>>/{ s#>>#\\033[1m\\033[4# ; s#>>#m# ; s#$#\\033[0m#} ' | xargs -0 -I {} printf '%b' "{}"

No, a ze sedu jsem vyházel ty proměnné \1 a \2, bez nich to bude rychlejší. Také printf jsem udělal blbuvzdornější, aby měl jardík klidné spaní.
1.3.2016 18:46 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Příloha:
Bohužel to havaruje i na tomto, kdežto ten perl funguje stále-
1.3.2016 20:24 RM
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
| xargs -d '\n' -I {} printf '%b' "{}\\n"
2.3.2016 08:08 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Lepší, jen mi tam něco žere znaky dole a zůstane tam jen torzo "http". Mimochodem to >>XX>> značí pořadí duplikátů po vyčerpání barev nebo to bere i s těma barevnýma, předtím jsem myslel, že odkazuje na řádky. Je mi jasný, že až smažu barevný a provedu kontrolu znovu, místo >>XX>> budou zase jen barevný. Poslední věc bych si přál, jestli by mohl být soubor uvedený jako poslední argument nikoliv uprostřed těch několika přesměrovaných příkazů (aby to šlo použít v Bluefishi nebo i jako alias)?
2.3.2016 10:32 RM
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
žere znaky dole

změň oddělovače IFS z : na jiné -- navrhuji ^X (CTRL-V CTRL-X)
2.3.2016 10:40 RM
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
jako poslední argument....aby...použít alias

manuál bashe říká -- používejte raději "funkce" než aliasy, Pak můžeš použít parametr $1, který ti makro-procesor krásně expanduje tam kde žádáš
2.3.2016 10:46 RM
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
předtím jsem myslel, že odkazuje na řádky

právě v tom je celé know-how mého řešení, že na řádky neodkazuje, což by bylo o něco jednodušší. Jedná se o pořadí duplicit, z čehož se nechají pak také lehce obarvit (jen prvních 9). Myslel jsem, že je to jasný od začátku.
2.3.2016 11:33 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Dobrá nějak se s tím poperu.
(jen prvních 9)
Pokud těch prvních devět už nebude mít svůj duplikát, bude obarveno zase dalších devět, je to tak, zkrátka dokud nesmažu alespoň jeden duplikát?
2.3.2016 12:46 RM
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
přesně tak
wamba avatar 28.2.2016 23:16 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Perl 6 a Perl jsou dva různé jazyky. Perl 6 můžeš někde nainstalovat pomocí balíčku rakudo. Použil jsem ho jen proto, že v něm experimentuji a napadlo hezké řešení. Napsat to jde v spoustě věcí v Perlu např.
perl -nE 'BEGIN{ my %line; }; chomp; push @{$line{$_}}, $.; END{ for (keys %line) { say $_ . q{: } . join q{, }, @{$line{$_}} if @{$line{$_}} > 1;}; };'
ale nevypadá to, tak elegantně jak v Perlu 6 :)
This would have been so hard to fix when you don't know that there is in fact an easy fix.
29.2.2016 15:36 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Wow, tak tohle stejně efektivní ;-) Líbí se mě obě stejně takže dvě první místa ;-) Mohl bys dát i výstup toho perl6, jsem jenom zvedavý, i když tam třeba neuvidím barvy?
wamba avatar 29.2.2016 16:11 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Input:
perl6 -e 'my %rows .= push: lines.pairs.invert; %rows.grep( *.value.elems > 1 )>>.say' <<EOF
! flora
jetel
len
! fauna
jelen
lev
! nebe
letadlo jelen
tupolev
! dalsi
lentilka
jelenice
jitrnice
jetel
lev
EOF
Output:
jetel => [1 13]
lev => [5 14]
Převádí se to do pole tak jsou řádky číslovány od 0. U Perlu 6 zatím drhne rychlost, ale tisíce by ještě měli být v pohodě.
This would have been so hard to fix when you don't know that there is in fact an easy fix.
29.2.2016 16:26 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Taky hezký, tamto je naprosto dostatečné a přehledné. Sice musím otvírat stejný soubor 2x ale to nic neubírá na efektivitě.
pepe_ avatar 29.2.2016 23:25 pepe_ | skóre: 48
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?

To je nějaké divné ...

pepe@PC-PEPE-LINUX:~$ perl -nE 'BEGIN{ my %line; }; chomp; push @{$line{$_}}, $.; END{ for (keys %line) { say $_ . q{: } . join q{, }, @{$line{$_}} if @{$line{$_}} > 1;}; };' < file.txt lev: 6, 15 jetel: 2, 14 pepe@PC-PEPE-LINUX:~$ perl6 -e 'my %rows .= push: lines.pairs.invert; %rows.grep( *.value.elems > 1 )>>.say' < file.txt jetel => [1 13] lev => [5 14] pepe@PC-PEPE-LINUX:~$ cat file.txt ! flora jetel len ! fauna jelen lev ! nebe letadlo jelen tupolev ! dalsi lentilka jelenice jitrnice jetel lev
  Jakto že to označuje pokaždé něco jiného ?
wamba avatar 1.3.2016 00:46 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Co se ti nezdá, že jednou je 2, 14 a podruhé 1, 13? To protože jednou to čísluje řádky od 1 a podruhé od 0. Jak už jsem psal, ten příklad v Perlu 6 přistupuje k tomu souboru jako k seznamu řádků a první index v seznamu je 0.
This would have been so hard to fix when you don't know that there is in fact an easy fix.
29.2.2016 16:14 Mirek
Rozbalit Rozbalit vše Re: Čím najít duplikátní řádky?
Navíc to lze použít jako externí filtr v Bluefishi.

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.