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?
- 1438 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
> Mondjuk azt, hogy X string ezekben a sorokban fordul elő:..
grep ...
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
> végigkeresi String2-t aztán ha nem talált egyezést akkor string3-at nézi végig, majd string4-et.
grep String2 fileom || grep string3 fileom || grep string4 fileom
- A hozzászóláshoz be kell jelentkezni
Tisztajó, csak ilyen Stringből több ezer van. :)
- A hozzászóláshoz be kell jelentkezni
Megvárom, amíg minden részlet az eszedbe jut.
- A hozzászóláshoz be kell jelentkezni
Igazad van, szerintem mostmár okés. :)
- A hozzászóláshoz be kell jelentkezni
Nagyságrendek? 10G, 10T? Futtatás? Percenként 100-szor, ... ?
- A hozzászóláshoz be kell jelentkezni
Nem, az ilyesmi nem jön szóba, naponta 2X 2000 soron.
Szóval sebesség, meg hasonlók nem számítanak.
- A hozzászóláshoz be kell jelentkezni
Valami ilyesmi:
while read p ; do grep "$p" text.txt && break ; done < pattern.txt
pattern.txt
nincsilyen
#string8#
#string6#
text.txt
#string1#string2#
#string3#string4#
#string7#string8#
#string5#string6#
--
... fogpiszkáló, ha el nem baxom!
- A hozzászóláshoz be kell jelentkezni
Jónak néz ki, köszönöm szépen! :)
- A hozzászóláshoz be kell jelentkezni
Amúgy ismét rosszul írtam.
Így:
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 string4-et nézi végig, majd string6-ot.
Ilyet tudnak a fenti programok? :O
- A hozzászóláshoz be kell jelentkezni
sed és awk szkriptelhető. Perl teljes értékű programozási nyelv. Ezek tudják amit szeretnél. Persze ettől még meg kell tudni írni a programot (szkriptet) hozzájuk.
Azt hiszem innentől a kérés rész jön ;)
- A hozzászóláshoz be kell jelentkezni
awk, sort, uniq, sed, (bash)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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]'
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni