Toon posts:

[BASH] Woorden uit txt bestand scheiden

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een bash scriptje; dat tot nu toe info uit een html pagina haalt en in een txt bestand stopt.
Dit heb ik gedaan mbv grep.

Nou is de volgende stap om deze info in een MySQL DB te stoppen.
Hiervoor moet de info gescheiden worden en niet per regel zoals bij grep.

De txt ziet er nu uit zoals:

code:
1
2
 NAAM EEN      0,47      0,56   + 19,15%
 NAAM2        90,70     91,15   +  0,50%

Mijn vraag is daarom hoe scheidt ik in bash deze info zodat ik drie strings krijg:

naam="NAAM EEN"
vorig=0,47
huidig=0,56

naam=NAAM2
vorig=90,70
huidig=91,15

Zodat ik deze weer makkelijk kan gebruiken in een SQL query om mee te geven aan mysql -e voor het invoeren :P

  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 27-08 21:58

odysseus

Debian GNU/Linux Sid

Perl:
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
$file = "mijnbestand.extensie"
open (FILE, "$file") || die "Couldn't open file: $!";
while (<FILE>)
{
  @items = split (/\t/, $_);
  print "naam=$items[0]\n", "vorig=$items[1]\n", "huidig=$items[2]\n\n";
}
close FILE;

Code is uit het blote hoofd en zo, niet getest dus :). Je kunt het ook even ombouwen zodat hij direct dat MySQL-commando uitvoert als je dat liever hebt.

[ Voor 3% gewijzigd door odysseus op 21-11-2002 21:49 ]

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


Verwijderd

Topicstarter
Bedankt voor je oplossing.

Ben niet echt bekent met perl :/

Moet ff uitzoeken want hij werkt nog niet helemaal maar is op zich wel een oplossing!

Weet je misschien ook nog een bash oplossing met cut ofzo?
Dat zou natuurlijk nog mooier zijn omdat de rest ook in bash is :P

Verwijderd

Je moet het een en ander met pipes doen. Kijk eens naar het commando 'tr' om het splitten te vermakkelijken en 'read' om variabelen in te lezen.


Edit:
Ik heb hier nog een script die wij gebruiken om database records uit te lezen en direct in een html tabel te knallen. Ik denk dat je hieruit ook wel het een en ander kan halen. (De code is niet voledig!)

Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function fTabelQuery()
{
  select=$1
  kop1=$2
  kop2=$3
  kop3=$4

  fTabelInhoud "$kop1" "$kop2" "$kop3"  

  fDBQuery "$select" "-N" | tr '    ' ':' \
   | while IFS=: read VAR1 VAR2 VAR3
  do
    fTabelInhoud "$VAR1" "$VAR2" "$VAR3"
  done
}


Het script om de query uit te voeren.
Bash:
1
2
3
4
5
6
7
8
function fDBQuery()
{
  query=$1
  opties=$2

  mysql --user=root --password=[PASSWORD] -h [IP]\
        --database=[DBNAAM] --execute="$query" $opties
}

[ Voor 73% gewijzigd door Verwijderd op 21-11-2002 22:22 ]


  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 31-03 16:47

CyberSnooP

^^^^ schrijft --->

Zou het niet verstandiger zijn je script een reeks SQL-commandos te laten wegschrijven en die dan later uitvoeren i.p.v. voor elke query een executable aan te roepen?

|_____vakje______|


  • PrinsEdje80
  • Registratie: Oktober 2001
  • Laatst online: 01-01 15:26

PrinsEdje80

Holographic, not grated...

Kun je niet beter awk gebruiken? Moet je de manpage ff naslaan om het splitsen te vinden.

Used to be Down Under... Foto gallery


Verwijderd

Topicstarter
CyberSnooP schreef op 21 November 2002 @ 22:56:
Zou het niet verstandiger zijn je script een reeks SQL-commandos te laten wegschrijven en die dan later uitvoeren i.p.v. voor elke query een executable aan te roepen?
idd dit was ik ook al van plan hoor een SQL-script te laten maken ik zei het verkeert ;)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Google:
http://www.mcsr.olemiss.edu/cgi-bin/man-cgi?cut+1

Dan hoef je geen script engine te starten.

Vervolgens is het een kwestie van PASSWORD=`echo $LINE | cut -b 15-20` of zo.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op 22 November 2002 @ 08:59:
Google:
http://www.mcsr.olemiss.edu/cgi-bin/man-cgi?cut+1

Dan hoef je geen script engine te starten.

Vervolgens is het een kwestie van PASSWORD=`echo $LINE | cut -b 15-20` of zo.
Ik hoopte het ook met cut te doen maar het ligt iets ingewikkelder dan dat jij aangeeft, omdat de afstand niet bij elke regel het zelfde aantal bytes is :/

Verwijderd

Topicstarter
Ik ben nu wel een stap verder door dit te gebruiken:
code:
1
2
$ echo BLAAT AAP        20,3         1,23 | cut -d ' ' -f3,4
$ 20,3 1,23

Dat is dus psies wat ik nodig heb.
Nou is mijn volgende probleem dat op de ene regel twee woorden staan en dan het getal maar op een andere maar één woord en dan het getal.
Zoals dit:
code:
1
2
$ echo BLAAT        14,3         13,27 | cut -d ' ' -f3,4
$ 13,27

Zoals je ziet gebruik ik de zelfde cut line maar die gaat hier dus niet op :/

Weet iemand hoe ik dit oplos?

[ Voor 26% gewijzigd door Verwijderd op 22-11-2002 13:04 ]


Verwijderd

Door een tab '\t' als Field Separator te gebruiken en niet een spatie. Net zoals dat in dat perl script gebeurt.

Verwijderd

Topicstarter
Verwijderd schreef op 22 November 2002 @ 13:09:
Door een tab '\t' als Field Separator te gebruiken en niet een spatie. Net zoals dat in dat perl script gebeurt.
Dit klinkt erg goed :)
Zou je me even op weg kunnen helpen?
Want het lijkt er op dat hij netjes de tabs weg haalt maar dat -fx,x niet meer werkt :?

Want de output is nu zo:
code:
1
2
$ echo TEST TWEE      32,2           34,5 | cut -d \t -f1
$ TEST TWEE 32,2 34,5

Door de -d \t optie ziet ie geen verschil meer lijkt wel, dus nu ben ik eigenlijk nog niks opgeschoten :?

Verwijderd

Je oorspronkelijke output werkte met tabs, anders zou dat perl script niet werken.
Je moet dus ook testen op de oorspronkelijke output en niet op een echo-line waarin geen tabs maar spaties zitten. (en je moet quotes om die \t zetten)

Verwijderd

Topicstarter
Verwijderd schreef op 22 November 2002 @ 13:42:
Je oorspronkelijke output werkte met tabs, anders zou dat perl script niet werken.
Je moet dus ook testen op de oorspronkelijke output en niet op een echo-line waarin geen tabs maar spaties zitten. (en je moet quotes om die \t zetten)
Zou je me niet een voorbeeld bash scripie kunnen geven dat zou me erg helpen.
Uit gaande van de twee lines in mn eerste post en hoe ik ze verdeeld wil hebben?

BTW. Ik heb dus geen perl gebruikt dat was een tip en die script werkt ook niet :/

[ Voor 8% gewijzigd door Verwijderd op 22-11-2002 14:11 ]


  • Nappa
  • Registratie: Februari 2001
  • Laatst online: 28-08 04:13

Nappa

The Barbaric Saiya-jin!

Kun je geen cut -c gebruiken? Je uitvoer is namelijk netjes geformatteerd.
Bijvoorbeeld "cut -c 1-13" levert alle namen op, "cut -c 14-20" alle vorige, etcetera.

Alles wat ik zeg kan en zal tegen u gebruikt worden
Scream! Suffer! Panic! | Dark-future Dawnbringer | Unofficial Mordor community


  • Red Sonja
  • Registratie: Juli 2001
  • Laatst online: 01-07 13:16

Red Sonja

Linux: power to de wortel

Tip: gebruik mysqlimport ;)

And the beast shall be made legion. Its numbers shall be increased a thousand thousand fold. The din of a million keyboards like unto a great storm shall cover the earth, and the followers of Mammon shall tremble. from The Book of Mozilla, 3:31

Pagina: 1