Sziasztok.
Adott egy 200 soros szövegfile, melyben nincs space sem.
A sorok kb. 40 karakter hosszúak, és én csak az első 35 karakter alapján szeretném sorbarendezni a sorokat. Ékezetek nincsenek.
Szerintetek awk hogyan alkalmazható erre?
--------
a probléma bonyolultabb, imént hiányosan fogalmaztam:
- 1460 megtekintés
Hozzászólások
Rendezésre leginkább a sort való, miért az awk-t szeretned használni erre?
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
az utolsó 5 karaktert nem akarom, hogy sorbarendezze.
Baj lenne belőle.
- A hozzászóláshoz be kell jelentkezni
Küldtem ilyen kódot neked pár perce, ami a végét békénhagyja ... igaz Python-ban.
- A hozzászóláshoz be kell jelentkezni
Igen, köszi, éppen azt nézegetem.
- A hozzászóláshoz be kell jelentkezni
Vagy megírod magad a rendező eljárást, vagy meghívod AWK-ból a Marci által javasolt sort -ot. De legjobb ebből a feladatból kihagyni az AWK-t teljes egészében, és csak magát a sort-ot használod:
sort -k 1.1,1.4 data
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
A gawk-ban van asort(), aminek meg lehet adni hasonlító függvényt. Az nem jó?
- A hozzászóláshoz be kell jelentkezni
Nekem bármi jó lenne, néha C++-ben írok kínomban valamit, persze más célból.
- A hozzászóláshoz be kell jelentkezni
A qsort() függvényt is meghívhatod akár C-ből is.
- A hozzászóláshoz be kell jelentkezni
Szörnyű bejelentésem van, elrontottam a kérdésemet.
Most már alaposabban megfogalmazom, elsiklottam felette. Gyakorlatilag a soronkénti stringek eleje is ignorálandó a sorbarendezésből.
61-70. karakterek szerint szeretnék rendezni, ezért is gondoltam az awk-ra, vagy értelemszerűen a perl, python is szóba jöhetne, nem tudom, teljesen letompult az agyam a mai napon.
- A hozzászóláshoz be kell jelentkezni
Zahy már megadta a megoldást fentebb. Ha nincs benne white space karakter, akkor:
sort -k 1.61,1.70 test.txt
- A hozzászóláshoz be kell jelentkezni
Köszönöm, működik :)
Nem tudtam a sort eme használatáról
- A hozzászóláshoz be kell jelentkezni
Erre csak egy rpi HA cluster oracle db-vel alkalmas! Mínium. :)
Ha egyszerűbb lenne a kérdés, akkor a man sort a válasz. (Ezt a google is megeszi!)
sort -k 1.61,1.70 data
De ez már volt feljebb.
Ha ennyire nem vagy biztos a dolgodban, akkor esetleg a sor hosszát is ellenőrizni kellene...
- A hozzászóláshoz be kell jelentkezni
Az hagyján, de még csak nem is awk-val akartál sorbarendezni, ahogy a topik címe sejteti... :D
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Köszi mindenkinek, ez itt most mind hasznos volt egyszerre.
Az ember mindig tanul
- A hozzászóláshoz be kell jelentkezni
Új probléma merült fel az eddigiekhez képest.
Íme 3 sor:
'
\item valami1, \hyperpage{10}
\item valami3, \hyperpage{348}
\item valami2, \hyperpage{8}
'
ezt a file-t a sort békén hagyná, ha a { után álló string szerint rendezné, mert szerinte rendezett. Csakhogy ott én azt szeretném, ha számként lenne értelmezve a { jel után álló 1-4 karakter (azért 4, mert nem hinném, hogy a számok 5 jegyűek lennének valaha ott...)
Szóval egyelőre nem tudom hogyan sortoljak, félek, hogy valami borzalmasan hosszút írnék, bevonva a BASH egész arzenálját.
Egészen rövidre zárva a problémát, azt akarom megszüntetni, hogy a makeindex által generált tex/latex névmutató a szó szerint rendezzen. Valamiért azt szeretném, ha az oldalszámok folyamatosan növekednének, mert itt épp erre lenne szükség
- A hozzászóláshoz be kell jelentkezni
A fájlban csak és kizárólag ilyen sorok vannak?
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
igen.
- A hozzászóláshoz be kell jelentkezni
Pythonban.
Az fkey() a kulcsfgv a rendezéshez; a sorok stringként lesznek összehasonlítva, de a számokat előzőleg balról 8 jegyre bővítjük 0-kal. Ha mégis lenne más formátumú sor a fájlban, akkor az is "rendeződik".
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
ifname="input.tex"
ofname="output.tex"
def fkey(s):
head,sep,tail= s.partition("{")
if not sep:
return s
numstr,sep,tail= tail.partition("}")
if not sep:
return s
return "{:08}".format(int(numstr))
with open(ifname) as ff:
ltxt= ff.readlines()
ltxt.sort(key=fkey)
with open(ofname,"w") as ff:
ff.writelines(ltxt)
--
eutlantis
- A hozzászóláshoz be kell jelentkezni
új tanulnivalóim egyike ez is
- A hozzászóláshoz be kell jelentkezni
Perlben, az input a stdin, output a stdout.
Azt hiszem... nekem működött.
(jó, tudom, már megoldva, csak az utókor számára :) )
ui: bármennyire szeret(t)em a Pythont és tartom olvashatatlannak a perlt, azért vannak dolgok, amiket egész tömören le lehet írni benne. :)
(a fentin még bőven lehet zsugorítani, csak a viszonylagos olvashatóság miatt írtam ilyenre)
- A hozzászóláshoz be kell jelentkezni
sort -t' ' -k3.12n test.txt
- A hozzászóláshoz be kell jelentkezni
Köszönöm!
- A hozzászóláshoz be kell jelentkezni
Ja, igen, a sort-nél akár több rendezési kulcsot is meg lehet adni, és akár az összesnek lehet más a rendezési elve:
sort -k 3 -k 1n -k 5r ...
Az első rendezésnél figyelembe veendő adat a 3. mező lesz, ezt normál (ABC-szerinti növekvő) módon kell rendezni. Ha van két (vagy több) rekord ami e szerint a mező szerint azonos, akkor figyelembe vesszük az 1. mezőt is, de ott nár numerikusan növekvő lesz a rendezés (az ABC-rend helyett). És ha még így is találunk atonosnak tekintett mezőket, akkor vegyük figyelembe az 5. mezőt, de ott ABC-szerinti csökkenő (reverse) sorrendet kell tartani. És í. t, elég sok rendezési kulcsot meg lehet adni.
=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?
- A hozzászóláshoz be kell jelentkezni
aszem megvan a tex-megoldás is:
\begin{document}
Refering to OM A 1.1\index{OM A!01.01@1.1}.\\
Refering to OM A 1.2\index{OM A!01.02@1.2}.\\
Refering to OM A 2.2\index{OM A!02.02@2.2}.\\
Refering to OM A 10.4\index{OM A!10.04@10.4}.\\
Refering to OM A 3.3\index{OM A!03.03@3.3}.\\
Refering to OM A 4.4\index{OM A!04.04@4.4}.\\
Refering to OM A 12.2\index{OM A!12.02@12.2}.\\
\printindex
\end{document}
%gyakorlatilag kicsit másképp kell belegúrni a zindexbe a cuccost
%(az eredmény csak akkor látható, ha legeneráljuk az indexet)
- A hozzászóláshoz be kell jelentkezni
Egyébként ha az awk már kéz alá esik, de nincsenek evidenciában olyan nyalánkságok, mint a sort kulcsdefiníciója, nem tilos azt egy pipe-ban akár többször meghívni.
awk 'match( $0, /{[0-9]+}/) { print substr($0,RSTART+1,RLENGTH-2), $0}' in.txt | sort -n | awk '{sub(/^[0-9]+ /, ""); print}'
\item valami2, \hyperpage{8}
\item valami1, \hyperpage{10}
\item valami3, \hyperpage{348}
Azaz kinyessük a szükséges számokat a sorokból és kiírjuk a sor elejére egy szóközzel (1. awk); a kimenetet numerikusan rendezzük (az első mező lesz a meghatározó); aztán eldobjuk az első mezőt és szóközt és kiírjuk azt, ami maradt (2. awk).
Nem kell megijedni a bemenet összeszemetelésétől, ha tudjuk, hogy hogyan szemetelünk, miáltal el tudjuk dobni a szemetet.
- A hozzászóláshoz be kell jelentkezni