[bash]text files 'inner joinen'

Pagina: 1
Acties:

  • axis
  • Registratie: Juni 2000
  • Laatst online: 26-01-2023
Ik heb op een BSD machine 2 outputs, die ik op elkaar zou willen joinen..

output van de tape changer:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ chio status -v
picker 0:  voltag: <:0>
slot 0: <ACCESS,FULL> voltag: <000231L3:0>
slot 1: <ACCESS,FULL> voltag: <000227L3:0>
slot 2: <ACCESS,FULL> voltag: <000224L3:0>
slot 3: <ACCESS,FULL> voltag: <000252L3:0>
slot 4: <ACCESS,FULL> voltag: <000229L3:0>
slot 5: <ACCESS,FULL> voltag: <000226L3:0>
slot 6: <ACCESS,FULL> voltag: <000223L3:0>
slot 7: <ACCESS,FULL> voltag: <000251L3:0>
slot 8: <ACCESS,FULL> voltag: <000228L3:0>
slot 9: <ACCESS,FULL> voltag: <000235L3:0>
slot 10: <ACCESS,FULL> voltag: <000222L3:0>
slot 11: <ACCESS,FULL> voltag: <000239L3:0>
slot 12: <ACCESS,FULL> voltag: <000236L3:0>
slot 13: <ACCESS,FULL> voltag: <000233L3:0>
slot 14: <ACCESS,FULL> voltag: <000230L3:0>
slot 15: <ACCESS,FULL> voltag: <000240L3:0>
slot 16: <ACCESS,FULL> voltag: <000237L3:0>
slot 17: <ACCESS,FULL> voltag: <000234L3:0>
slot 18: <ACCESS,FULL> voltag: <000254L3:0>
slot 19: <ACCESS,FULL> voltag: <000246L3:0>
slot 20: <ACCESS> voltag: <:0>
slot 21: <ACCESS> voltag: <:0>
slot 22: <ACCESS,EXCEPT,FULL> voltag: <CLNU00L1:0>
portal 0: <INEAB,EXENAB,ACCESS> voltag: <:0>
drive 0: <ACCESS> voltag: <:0>

en het lijsje met barcodes voor een specifieke amanda job:
code:
1
2
3
4
5
6
7
8
9
10
11
12
$ cat changer-barcodes
monthly-01 000232L3
monthly-02 000221L3
monthly-03 000238L3
monthly-04 000225L3
monthly-05 000253L3
monthly-06 000254L3
monthly-07 000241L3
monthly-08 000242L3
monthly-09 000243L3
monthly-10 000244L3
monthly-11 000245L3


Weet iemand een simpele machier om die 2 op elkaar te joinen zodat ik makkelijk in 1 overzichtje die bij elkaar kan zien? Ik wordt een beetje moe van het manueel bij elkaar zoeken. Wat ik dus bijvoorbeeld zou willen als output is (zie slot 18, toevallig zit er nu 1 month tape in de changer):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
picker 0:  voltag: <:0>
slot 0: <ACCESS,FULL> voltag: <000231L3:0>
slot 1: <ACCESS,FULL> voltag: <000227L3:0>
slot 2: <ACCESS,FULL> voltag: <000224L3:0>
slot 3: <ACCESS,FULL> voltag: <000252L3:0>
slot 4: <ACCESS,FULL> voltag: <000229L3:0>
slot 5: <ACCESS,FULL> voltag: <000226L3:0>
slot 6: <ACCESS,FULL> voltag: <000223L3:0>
slot 7: <ACCESS,FULL> voltag: <000251L3:0>
slot 8: <ACCESS,FULL> voltag: <000228L3:0>
slot 9: <ACCESS,FULL> voltag: <000235L3:0>
slot 10: <ACCESS,FULL> voltag: <000222L3:0>
slot 11: <ACCESS,FULL> voltag: <000239L3:0>
slot 12: <ACCESS,FULL> voltag: <000236L3:0>
slot 13: <ACCESS,FULL> voltag: <000233L3:0>
slot 14: <ACCESS,FULL> voltag: <000230L3:0>
slot 15: <ACCESS,FULL> voltag: <000240L3:0>
slot 16: <ACCESS,FULL> voltag: <000237L3:0>
slot 17: <ACCESS,FULL> voltag: <000234L3:0>
slot 18: <ACCESS,FULL> voltag: <000254L3:0> monthly-06 000254L3
slot 19: <ACCESS,FULL> voltag: <000246L3:0>
slot 20: <ACCESS> voltag: <:0>
slot 21: <ACCESS> voltag: <:0>
slot 22: <ACCESS,EXCEPT,FULL> voltag: <CLNU00L1:0>
portal 0: <INEAB,EXENAB,ACCESS> voltag: <:0>
drive 0: <ACCESS> voltag: <:0>


Is er een bash commando of tool (zoals awk, grep, etc) waarmee ik dit voor elkaar kan krijgen?

Two advices for network troubleshooting.. learn to draw diagrams in Visio, and THINK IN LAYERS!


  • Elijan9
  • Registratie: Februari 2004
  • Laatst online: 26-01 13:48
Om kort te antwoorden, ja zulke tools zijn er te over, het ligt aan jouw voorkeur/behendigheid waar je dit het beste in kunt doen... Je kunt dit zelfs in bash doen, maar ik zou je python adviseren, maar daar ben ik niet helemaal objectief in. Ruby en perl zijn ook goede mogelijkheden en het kan denk ik ook wel in sed (i.c.m. bash).

Python werkt gewoon wel snel denk ik, omdat je hierbij al snel reguliere expressies nodig hebt en python daarbij goed te programmeren is en leesbaar blijft.

War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic


  • silentsnake
  • Registratie: September 2003
  • Laatst online: 15-01 11:20
Ik zie niet waarom Python hier "beter" in is dan Perl. Dat het sneller is dan het door sed heen trekken geloof ik best, maar Perl zou hier net zo goed geschikt voor zijn, en dat vind je ook sneller op een *NIX doos dan Python.

Kortom, any language will do. Waar jij je het meest in thuis voelt. Als je naar Perl gaat kijken, kijk eens naar de Perl module Tie::File, daar maak je van je files een array, waarbij een array element een regelnummer voorsteld. Daar kan je waarschijnlijk icm regexp wel wat leuke scripjes mee maken.

Success!

[ Voor 6% gewijzigd door silentsnake op 02-06-2009 12:51 ]


Verwijderd

Je kan het ook met gewoon shellscript doen.
Maar perl is zeker aan te raden.

  • elTigro
  • Registratie: November 2000
  • Laatst online: 23-11-2025

elTigro

Es un Gringo!

Verwijderd schreef op dinsdag 02 juni 2009 @ 13:07:
Je kan het ook met gewoon shellscript doen.
Maar perl is zeker aan te raden.
Mij lijkt Perl ook fijner (omdat ik het beter ken natuurlijk) maar in shellscript kun je iets als:
Bash:
1
2
3
4
5
cat $bestand1 |while read  LINE ; do 
   voltag=echo $LINE | cut -f5 |knutsel <> weg
   lijnuitfile2=grep $voltag $bestand2
   enzovoort en vooral iets met sed dan
done


moet te doen zijn toch?

[ Voor 9% gewijzigd door elTigro op 02-06-2009 13:21 ]

Lazlo's Chinese Relativity Axiom:No matter how great your triumphs or how tragic your defeats --approximately one billion Chinese couldn't care less.


Verwijderd

Heel quick en dirty:

code:
1
chio status -v | sed -e "`cat changer-barcodes | sed \"s/^\(.\+\)\ \(.\+\)$/s\/\2\/\1\/g/g\"`"

  • jschot
  • Registratie: Oktober 2002
  • Laatst online: 09-07-2025
Als je het echt in shell wil doen zou ik eens naar het standaardcommando join(1) kijken. Snel voorbeeldje:

code:
1
2
awk '{ print $0, "<"$NF":0>"}' changer-barcodes > tmp
chio status -v |join -a 1 -1 5 -2 3 - tmp > result

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 27-01 18:27

Kees

Serveradmin / BOFH / DoC
Elijan9 schreef op dinsdag 02 juni 2009 @ 11:02:
Om kort te antwoorden, ja zulke tools zijn er te over, het ligt aan jouw voorkeur/behendigheid waar je dit het beste in kunt doen... Je kunt dit zelfs in bash doen, maar ik zou je python adviseren, maar daar ben ik niet helemaal objectief in. Ruby en perl zijn ook goede mogelijkheden en het kan denk ik ook wel in sed (i.c.m. bash).

Python werkt gewoon wel snel denk ik, omdat je hierbij al snel reguliere expressies nodig hebt en python daarbij goed te programmeren is en leesbaar blijft.
Om even offtopic te gaan; in principe maakt de scripttaal heel erg weinig uit, dus ik denk niet dat je snel iets 'beter' kan vinden dan het andere. Python en Perl zijn prima talen, maar geef mij toch maar een PHP-cli script, vind ik toch vaak veel gemakkelijker dan wat dan ook (zeker op webservercluster, waarbij je dan eventueel ook gewoon de configfiles van de website kan gebruiken zonder moeilijke conversies)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • jeroenikke
  • Registratie: Augustus 2003
  • Laatst online: 23:09
het commando join lijkt mij ook het meest geschikt.
Eerst wat substituties met regexp met sed of awk om een goeie kolom seperator te hebben, en dan gewoon join gebruiken

  • Elijan9
  • Registratie: Februari 2004
  • Laatst online: 26-01 13:48
Kees schreef op dinsdag 02 juni 2009 @ 14:17:
[...]

Om even offtopic te gaan; in principe maakt de scripttaal heel erg weinig uit, dus ik denk niet dat je snel iets 'beter' kan vinden dan het andere. Python en Perl zijn prima talen, maar geef mij toch maar een PHP-cli script, vind ik toch vaak veel gemakkelijker dan wat dan ook (zeker op webservercluster, waarbij je dan eventueel ook gewoon de configfiles van de website kan gebruiken zonder moeilijke conversies)
Om even offtopic te blijven, je hebt net als een aantal anderen blijkbaar een probleem met lezen, want er staat toch echt nergens dat Python "beter" is dan perl?! Ik zeg nadrukkelijk"het ligt aan jouw voorkeur/behendigheid waar je dit het beste in kunt doen".

Ik zeg alleen dat python een goede keuze zou kunnen zijn, ook wat leesbaarheid betreft en dat ik daar niet objectief in ben. 8)7

Nogmaals, dit kun je ook prima in bash doen met read, bash pattern-matching en pipes. Mijn ervaring leert echter dat python heel wat sneller is dan bash als je er echt heel veel mee wilt doen (dan heb ik het wel over een gecompliceerd bash script wat >5000 regels bevatte.), maar snelheid is geen issue hier. Perl kan alles, maar kan niet alles leesbaar. sed werkt prima, maar is ook niet gemakkelijk te lezen.

War is when the young and stupid are tricked by the old and bitter into killing each other. - Niko Bellic


  • axis
  • Registratie: Juni 2000
  • Laatst online: 26-01-2023
Dank jullie voor je reacties, ik ga eens op mijn gemak prutsen met de genoemde opties..

(ik heb veel ervaring met C# en vbscript, en zou daarmee een scriptje in 5 minuutjes hebben op een windows machine, maar ik heb nog geen enkele ervaring met python en perl, vandaar de vraag voor standard gnu tools i.c.m. bash scripts, die snap ik ondertussen ook wel aardig ;) )

Two advices for network troubleshooting.. learn to draw diagrams in Visio, and THINK IN LAYERS!


Verwijderd

elTigro schreef op dinsdag 02 juni 2009 @ 13:20:
[...]

Mij lijkt Perl ook fijner (omdat ik het beter ken natuurlijk) maar in shellscript kun je iets als:
Bash:
1
2
3
4
5
cat $bestand1 |while read  LINE ; do 
   voltag=echo $LINE | cut -f5 |knutsel <> weg
   lijnuitfile2=grep $voltag $bestand2
   enzovoort en vooral iets met sed dan
done


moet te doen zijn toch?
Dit zou eventueel wel kunnen inderdaad maar dan wel heel simpel.. Alleen moet je wel de tweede file zin te catten en dan greppen op de voltag minus extra tekens en dan pasten lijkt mij.

[ Voor 16% gewijzigd door Verwijderd op 03-06-2009 12:00 ]


  • frankivo
  • Registratie: Januari 2002
  • Laatst online: 02-06-2025
axis schreef op woensdag 03 juni 2009 @ 08:21:
Dank jullie voor je reacties, ik ga eens op mijn gemak prutsen met de genoemde opties..

(ik heb veel ervaring met C# en vbscript, en zou daarmee een scriptje in 5 minuutjes hebben op een windows machine, maar ik heb nog geen enkele ervaring met python en perl, vandaar de vraag voor standard gnu tools i.c.m. bash scripts, die snap ik ondertussen ook wel aardig ;) )
je zou met C# en mono een eind moeten kunnen komen ook ;)

iRacing Profiel


  • mace
  • Registratie: Juni 2003
  • Laatst online: 25-01 14:46

mace

Sapere Aude

Ik zeg AWK, is er voor gemaakt.

  • user109731
  • Registratie: Maart 2004
  • Niet online
Voor de volledigheid de Python variant:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
barcodes = []

for line in open('changer'):
    parts = line.strip().split()
    if len(parts) == 2: 
        barcodes.append(parts)

for line in open('status'):
    line = line.strip()
    for job, barcode in barcodes:
        if barcode in line:
            print line, job, barcode
            break
    else: 
        print line

:p

En ja, dit kan vast korter, maar zo is het nog goed leesbaar.
Pagina: 1