awk-val sorbarendezés [megoldva]

Fórumok

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:

https://hup.hu/node/158386#comment-2208400

Hozzászólások

Rendezésre leginkább a sort való, miért az awk-t szeretned használni erre?

Üdv,
Marci

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.

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...

Köszi mindenkinek, ez itt most mind hasznos volt egyszerre.
Az ember mindig tanul

Ú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

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

https://pastebin.com/DrcDd47V

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)

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?

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)

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.