Fájlban keresés pro módra

Fórumok

Helló!

Van egy elég nagy fileom ami így néz ki:
#string1#string2#
#string3#string4#
#string5#string6#
#string7#string8#
stb.

Nomost a string1,3,5,7 mindig különböző ezzel szemben string2,4,6,8 előfordul, hogy egyezik.
Ezeket az ismétlődéseket szeretném kikerestetni. Kézzel nem nyerő, mert akkora a fájl, hogy karácsonyig keresgélhetnék.

Tudtok valami módszert/programot ami az ilyen ismétlődéseket ki tudná írni? (Mondjuk azt, hogy X string ezekben a sorokban fordul elő:....)
Esetleg ha ezt Libreoffice táblába importálom, az tud ilyesmit?

Hozzászólások

Pl: awk, gawk, sed, uniq, grep, cat és társaik. Meg normálisabb szövegszerkesztőkkel is megoldhatod (vi(m), emacs). De akár MS Excelben is, ha úgy tetszik. Vagy Paintben, de ebben a legnehezebb szerintem.

> Mondjuk azt, hogy X string ezekben a sorokban fordul elő:..

grep ...

Szerintem nem fogalmaztam eléggé világosan szóval arról lenne szó, hogy először végigkeresi String2-t aztán ha nem talált egyezést akkor string3-at nézi végig, majd string4-et.

Ilyet tudnak a fenti programok? :O

Nezzuk.. a file ugy nez ki, hogy # a szeparator, es ugye a 2. field ismetleseit keresed.. szoval:
2 oszlop megcserelese (egyszeru regexp, a [^#]* az a # karaktert nem tartalmazo stringN):
sed -e 's/#\([^#]*\)#\([^#]*\)#/#\2#\1#/'
2. oszlop kiemelese: (igazabol jo ra a cut, awk, stb.. is)
sed -e 's/#\([^#]*\)#\([^#]*\)#/\2/'
sorttal lehet rendezni, uniq meg kiveszi az egyezo/kulonbozo/egyedi sorokat..

Ez a parancs annyit csinal, hogy fogja a 2. oszlopot, rendezi, es kiirja az egyezo stringeket:
sed -e 's/#\([^#]*\)#\([^#]*\)#/\2/' tesztfile.txt|sort|uniq -d

LO tabla is jo, CSV is jo (es utana Calc).

--
Az emberek azt állítják, hogy múlik az idő, az idő viszont csak mosolyog, mert látja, hogy az emberek múlnak. - tibeti közmondás

Feltéve, hogy jól értelmeztem a kérdést:

perl -nE '@F=split /#/;if(exists $t{$F[2]}){say qq/Egyezés $F[2]-nél: $F[1] a(z) $.. sorban, korábban $t{$F[2]} volt/}else{$t{$F[2]}=$F[1]}' nagyfile.txt

Ha Windows alól próbálkozol, akkor a határoló idézőjeleket cseréld le "-re.

szerk: hacsak nem egy tipikus XY-problémával állunk szemben, azaz te X-et szeretnél, de Y-t kérdezel...

Ha esetleg eltávolítani szeretnéd az egyezéseket:

perl -nE '@F=split /#/;print unless(exists $t{$F[2]});$t{$F[2]}=$F[1]'

Megpróbálom lefordítani magyarra a kérdést...

Van egy 4 oszlopos tábla. A szeparátor a <number-sign>. Az első és az utolsó oszlop üres. A második oszlopban egyedi értékek szerepelnek. A harmadik oszlopon belül szerepelhetnek ismétlődő értékek. A harmadik oszlop minden olyan elemére, amely legalább két sorban előfordul (a harmadik oszlopban), listázzuk ki az összes előfordulást (teljes sort).

Annyit még fel fogok tenni, hogy a <number-sign>-on kívül van még kettő (POSIX locale-ben ispunct()) karaktered, amely a mezők tartalmában nem fordul elő. Erre azért van szükség, mert a uniq utility egy kicsit buta, és csak tab-ot és space-t fogad el határolónak.

A bonyolult script (GNU utility-kkel) az alábbi. A uniq-hoz a space-eket kicseréljük a <grave-accent>-re (ascii 0x60), a tab-okat a <circumflex>-re (ascii 0x5E), a <number-sign>-okat pedig space-ekre. A szűrés után visszacseréljük. Hogy e két cserekarakter szerepel-e a bemenő állományban, azt egy sima grep-pel meg tudod vizsgálni. (

grep '[`^]'

.)


unset LANG
export LC_ALL=POSIX

sort --stable -t '#' -k 3,3 INPUT.TXT \
| tr ' '$'\t''#' '`^ ' \
| uniq --all-repeated=separate --skip-fields=1 \
| tr '`^ ' ' '$'\t''#'

Ha azonos harmadik oszlopbeli értéken belül még rendezni akarod a második oszlopot, akkor távolítsd el a

--stable

kapcsolót.