Allt från Computex 2023
Permalänk

Jämförelse av listor

Jag har under mystiska omständigheter fått förtroendet att skapa en gemensam patchlista till några Solaris9-maskiner. Varje enhet har en unik lista som kan se ut på följande vis:

113434-24 113713-21 112951-12 112945-40 114503-14 116807-02 120464-03 114332-23 118558-20 112874-32 112970-09 116561-08 112907-06 112908-23 113277-40 112954-13 115553-20 112960-32 120441-01 112921-07 113451-10 114131-03 112963-25 118465-02 113318-22 113322-03 116546-04 113471-09 114718-05 115544-02 115542-02 116014-04 121319-01 121316-01 121314-01 120445-01 112964-14 116548-04 116543-04 116495-03 117155-07 120768-01 119438-01 116670-04 117125-02 114344-15 117123-05 113329-16 118335-04 113278-11 113077-15 119937-01 119929-01 113459-03 118305-05 116009-05 116557-04 120241-01 117124-10 118539-02 112837-09 114363-03 115259-03 114564-08 116340-05 116474-03 116669-12 112838-11 112925-06 121194-01 114731-08 119449-01 119447-01 120443-01 113584-16 112785-52 112661-08 112771-30 115158-10 120877-01 112868-19 117590-04 114600-05 112817-25 117119-05 112622-19 112764-08 117985-02 119976-01 112807-17 115738-04 115736-05 112811-02 112808-08 118300-02

Och en annan kan se ut så här:

113434-24 113713-21 112951-12 112945-40 114503-14 116807-02 120464-03 114332-23 118558-20 112874-32 112970-09 116561-08 112907-06 112908-23 113277-36 112954-13 115553-20 112960-32 120441-01 112921-07 113451-10 114131-03 112963-25 118465-02 113318-22 116546-04 113471-09 114718-05 115544-02 115542-02 116014-04 121319-01 121316-01 121314-01 120445-01 112964-14 116548-04 116543-04 116495-03 117155-07 120768-01 119438-01 116670-04 117125-02 114344-15 117123-05 113329-15 118335-04 113278-11 113077-15 119937-01 119929-01 113459-03 118305-05 116009-05 116557-04 120241-01 117124-10 118539-02 114363-03 115259-03 114564-08 116340-05 116474-03 116669-12 112838-11 112925-06 121194-01 114731-08 119449-01 119447-01 120443-01 113584-16 112785-52 112661-08 112771-30 112868-19 114600-05 112817-25 117119-05 112622-19 116126-04 112764-08 117985-02 119976-01 112807-17 112811-02 112808-08 118300-02

I stort sett ser de alltså ungefär likadana ut, men vissa maskiner har en del numreringar som andra saknar. Tanken är att alla dessa ska sammanställas till en enda stor, men det är av yttersta vikt att ordningen bibehålls. Om nästa maskin på listan har en till patch som måste installeras ska man alltså jämföra den med de andra och lägga till den patchen i den gemensamma listan. För tillfället sitter jag och gör detta manuellt i StarOffice, men förutom att det får mina ögon att blöda är det även väldigt tidskrävande.

Finns det något automatiskt sätt att jämföra alla dessa listor och skapa en gemensam där ordningen bibehålls?

Visa signatur

"I cannot. Yet I must. How do you calculate that? At what point on the graph do 'must' and 'cannot' meet? Yet I must. But I cannot."

Permalänk
Medlem

Hmm, man skall alltså lägga till de som fattas? eller har jag fattat fel
T.ex.

Lista ett: 10 13 17 13 23 + Lista två: 10 13 24 17 13 23 = 10 13 24 17 13 23

?

Detta är väldigt enkelt att programmera i haskell, jag kan nog skriva ett program åt dig ifall du behöver.

Hmm, när jag tänker efter så kanske det inte blir så överdrivet enkelt, beroende på hur listorna kan se ut och vad som skall göras (kan tänka mig ett par jobbiga fall) Men men, det skall gå att ordna ändå, bara jag fattat rätt.

Kan dock inte kolla på det förrens ikväll förmodligen, då det är dags att jobba nu!

Permalänk
Medlem

om jag har fattat det rätt så vill du har en lista på de uppdateringarna(nummerna i listan) som inte finns på samtlig maskiner eller?

Permalänk

Sortera listorna och kör sedan en diff på dem. Det kan du göra med t.ex. cat, diff och sort.

Permalänk
Citat:

Ursprungligen inskrivet av Micket
Hmm, man skall alltså lägga till de som fattas? eller har jag fattat fel
T.ex.

Lista ett: 10 13 17 13 23 + Lista två: 10 13 24 17 13 23 = 10 13 24 17 13 23

?

Detta är väldigt enkelt att programmera i haskell, jag kan nog skriva ett program åt dig ifall du behöver.

Hmm, när jag tänker efter så kanske det inte blir så överdrivet enkelt, beroende på hur listorna kan se ut och vad som skall göras (kan tänka mig ett par jobbiga fall) Men men, det skall gå att ordna ändå, bara jag fattat rätt.

Kan dock inte kolla på det förrens ikväll förmodligen, då det är dags att jobba nu!

Jo, så skall det vara. Den gemensamma listan ska alltså innehålla samtliga patchar (varje nummer är en patch), och de ska vara sorterade i samma ordning som i de individuella listorna.

Citat:

Ursprungligen inskrivet av Sachankara
Sortera listorna och kör sedan en diff på dem. Det kan du göra med t.ex. cat, diff och sort.

Jag kanske missuppfattade dig, men listorna måste bibehålla sin ordning. Annars blir det bara pannkaka av alltsammans

Visa signatur

"I cannot. Yet I must. How do you calculate that? At what point on the graph do 'must' and 'cannot' meet? Yet I must. But I cannot."

Permalänk
Medlem

Prova med comm...

comm lista1.txt lista2.txt

... och ta eventuellt bort indenteringen med t.ex. sed ...

comm lista1.txt lista2.txt | sed 's/\s//g'

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Ulrik Uppkastare
Jo, så skall det vara. Den gemensamma listan ska alltså innehålla samtliga patchar (varje nummer är en patch), och de ska vara sorterade i samma ordning som i de individuella listorna.

vad hade du tänkt om ordningen är omkastad i några av listorna:

a: 1 2 3 4 5 b: 1 2 4 3 5 a+b: ?

är det en icke-förekommande situation?

Visa signatur

bitte kein Hotlinking!

Permalänk
Citat:

Ursprungligen inskrivet av tubgirl
vad hade du tänkt om ordningen är omkastad i några av listorna:

a: 1 2 3 4 5 b: 1 2 4 3 5 a+b: ?

är det en icke-förekommande situation?

Det har inte inträffat av dom jag sorterat manuellt, och det borde heller inte förekomma. Fast guds vägar äro outgrundliga, så helt säker kan man ju aldrig vara...

Citat:

Ursprungligen inskrivet av lefant
Prova med comm...

Tack! Ett steg i rätt riktning.

Visa signatur

"I cannot. Yet I must. How do you calculate that? At what point on the graph do 'must' and 'cannot' meet? Yet I must. But I cannot."

Permalänk
Medlem

sort l1.txt | sed -e 's/ //g' > l1 && sort l2.txt > l2 && diff l1 l2

Permalänk
Medlem

Något jag är lite fundersam över hur två listor som t.ex;

1 2 3 4 5 1 2 3 6 7

skall sorteras som?
Kan lika gärna bli vilken som helst av dessa

1 2 3 4 5 6 7 1 2 3 4 6 5 7 1 2 3 4 6 7 5 1 2 3 6 7 4 5 1 2 3 6 4 7 5 1 2 3 6 4 5 7

Permalänk

Ehrm. Jag är lite osäker, faktiskt. Med de verkliga listorna brukar det oftast bara vara någon sak som skiljs åt så att man direkt ser vad som måste ändras... Ledsen att jag inte kan ge något uttömmande svar

Visa signatur

"I cannot. Yet I must. How do you calculate that? At what point on the graph do 'must' and 'cannot' meet? Yet I must. But I cannot."

Permalänk
Medlem

Annars har Sun ett snyggt patch tool för att just hålla koll på patchar och vilka man behöver installera.

Annars borde man kunna koda nått perlskript för det hela. Några timmars jobb kanske.

Jag antar att du vet formatet på varje rad ?

<patch id>-<version>

Se det som en vettig programmerings övning

Visa signatur

We live in the age o stupidity || SparcStation 20,384mb RAM,1gb disk,2*125mhz, Solaris8
--------------------------------------------------------------------------------------------
Every suicide is a solution to a problem. -- Jean Baechler

Permalänk
Medlem

jag skulle nog också tåta ihop något i python eller så som jämförde en lista mot ett 'orginal' rad för rad, där orginalet saknar en post tåtar man in den på nästa plats i orginalet och fortsätter så hela listan igenom.
sedan kör man bara alla listorna igenom denna apparat en efter en.
(eller 'går iterativt på dess stjärt', som det så populärt heter bland ungdomen.)

Visa signatur

bitte kein Hotlinking!

Permalänk
Medlem

Om det inte dyker upp sådana där jobbiga listor jag frågade om borde denna lösa uppgiften

I Haskell

PatchList.hs

main :: IO () main = do x <- readFile "listor.txt" let x' = (read x)::[[String]] let y = mergeAll x' writeFile "storlista.txt" $ show y putStrLn "Klar" mergeAll [] = [] mergeAll (x:xs) = mergeTwo x $ mergeAll xs mergeTwo [] y = y mergeTwo x [] = x mergeTwo x y | x!!0 /= y!!0 = start ++ mergeTwo y end | otherwise = (head x): mergeTwo (tail y) (tail x) where (start,end) = break (\z-> elem z y) x

listor.txt

[["1","2","3","4","5","6","7"], ["10","1","2","3","8","9","4","5","6","7"], ["1","2","12","3","4","5","6","7"]]

Vilket ger utskriften
storlista.txt

["10","1","2","12","3","8","9","4","5","6","7"]

Programmet kommer att fastna ifall det är flera listor med samma patcher i olika ordningar, men det borde du märka ifall det tar stopp

Vill du ha listorna skriva i en annan form får du säga till så fixar jag det.

Permalänk

Jag ska upprätta en staty till din ära i trädgården, Micket. Behöver inte sortera några fler listor för tillfället, men det kommer nog att komma till användning i framtiden.

Visa signatur

"I cannot. Yet I must. How do you calculate that? At what point on the graph do 'must' and 'cannot' meet? Yet I must. But I cannot."