Portál AbcLinuxu, 5. května 2025 16:23

Dotaz: vypsat spolecne radky dvou souboru

20.3.2009 16:37 geralt
vypsat spolecne radky dvou souboru
Přečteno: 317×
Odpovědět | Admin

Ahoj,

potreboval bych v shellu vypsat vsechny spolecne radky dvou sobobru (tj. ne to, co dela comm - ten najde jenom ty radky, ktere jsou v souborech na stejnych pozicich od zacatku).

Dekuju Geralt

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

Odpovědi

kozzi avatar 20.3.2009 18:18 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
a co udelat si skript napriklad compare.sh s timto obsahem:
while read -r x; do
        sed '/'$x'/ P;D' < $2;
done < $1
a ten sposutet tak ze das sh compare.sh prvni.txt druhy.txt
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
kozzi avatar 20.3.2009 18:22 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
problem by mohl byt v tom ze pokud by retezec obsahoval nektere znaky delalo by to potize
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
kozzi avatar 20.3.2009 18:28 kozzi | skóre: 55 | blog: vse_o_vsem | Pacman (Bratrušov)
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nebo o něco lepší bude toto:
porovnat(){
        while read -r y; do
                if [ "$x" == "$y" ]; then
                        echo -e "$y";
                fi
        done < $1;
}
while read -r x; do
        porovnat $2;
done < $1;
Linux je jako mušketýři "jeden za všechny, všichni za jednoho"
20.3.2009 19:05 l4m4
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud se řádky neopakují v rámci souboru, tak

sort file1 file2 | uniq -d

Pokud se opakují i v rámci jednoho souboru, tak je třeba upřesnit definici společného řádku.
20.3.2009 21:00 deadmail
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
Da sa pouzit aj prikaz comm (a nevadi ze su rovnake riadky v jednom subore), ale subory treba najprv utriedit (vid info coreutils), takze riesenie by mohlo byt:

comm -12 <(sort file1) <(sort file2)
20.3.2009 21:11 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
sort a >x
sort b >y
join -t^ x y
Namiesto ^ dosadit znak, ktory sa v ziadnom subore nevyskytuje
If you hold a Unix shell up to your ear, you can you hear the C.
21.3.2009 10:07 deadmail
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
a nakoniec rm x y
20.3.2009 21:33 geralt
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin

Diky za odpovedi. Radky se v zadnem ze souboru neopakuji. Jeste bych potreboval vedet, jak vypsat ty radky, ktere jsou v souboru A, ale ne v souboru B.


20.3.2009 22:39 l4m4
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
To je nějaká domácí úloha?

Pokračování triku s uniq:

sort fileA fileB fileB | uniq -u
20.3.2009 22:57 Ash | skóre: 53
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
Přemejšlení bolí, co :)
21.3.2009 10:05 deadmail
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
comm -23 <(sort file1) <(sort file2)
21.3.2009 10:13 deadmail
Rozbalit Rozbalit vše Re: vypsat spolecne radky dvou souboru
Komentar:

comm pracuje s utriedenymi subormi, takze bud utriedime do pomocnych suborov x a y (a tie potom vymazeme), alebo v bash-i mozeme vytvorit nepomenovanu ruru cez <(prikaz). Vypisuje tri stlpce - riadky len v prvom, len v druhom a v oboch suboroch. Prepinacmi vieme vybrat, ktore stlpce chceme zobrazit.

comm -XY <(sort file1) <(sort file2)

-12 ... vypis len spolocne riadky

-23 ... vypis riadky, ktore su len v prvom subore

-13 ... vypis riadky, ktore su len v druhom subore

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.