Nieuws:

Ubuntu-NL weer online!

Na een periode van technische problemen en een overbelaste server zijn we eindelijk weer bereikbaar.
Samen met Hobbynet, onze sponsor en hostingpartner, hebben we een oplossing gevonden zodat alles weer soepel draait.

Bedankt voor jullie geduld en begrip. We hopen nu weer verder te gaan waar we gebleven waren.

Het team van Ubuntu-NL

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: command line, kolommen maken  (gelezen 6181 keer)

pbecks

  • Gast
command line, kolommen maken
« Gepost op: 2008/02/20, 15:51:19 »
Hallo,

Ik heb een tekst bestand (tekst1.txt) met de volgende regel:

Jan, Henk, Loes, Marleen, Klaas, Hans,

Nu wil ik de inhoud van dit bestand aanpassen zodat er 2 kolommen onstaan (in dit geval 3 regels):

Jan    Henk
Loes  Marleen
Klaas Hans

Ik probeer een bash scriptje te maken die dit voor mij gaat doen. Ik kom echter niet verder....

Help?

command line, kolommen maken
« Reactie #1 Gepost op: 2008/02/20, 16:12:05 »
#!/bin/sh
mytext=`cat`
mytext2=`echo $mytext | sed 's/, /\n/g'`
counter=0
foreach x in $mytext2;do
  if [ `eval "$counter % 2"` -ne "0" ]; then
    echo -n "$x "
  else echo $x
  fi
  counter++
done
echo

Gebruik: cat bestand.txt | mijnscript.sh

UPDATE: kleine fout getypt... :(

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

BertvdP

  • Gast
command line, kolommen maken
« Reactie #2 Gepost op: 2008/02/20, 16:31:34 »
Of in perl
#!/usr/bin/perl
while (<>) {
  while (/(\w+), (\w+)/g) {
    print "$1\t$2\n";
  }
}

pbecks

  • Gast
command line, kolommen maken
« Reactie #3 Gepost op: 2008/02/21, 08:44:31 »
Hallo SeySayux,

Ik krijg de onderstaande foutmelding:


patrick@patrick-desktop:~/scripts/LANWAN$ cat /home/patrick/scripts/LANWAN/inloglijst.txt | /home/patrick/scripts/LANWAN/stacker.sh
/home/patrick/scripts/LANWAN/stacker.sh: 5: foreach: not found
eval: 1: 0: not found
[: 9: 0: unexpected operator

/home/patrick/scripts/LANWAN/stacker.sh: 10: counter++: not found
/home/patrick/scripts/LANWAN/stacker.sh: 11: Syntax error: "done" unexpected

Wat gegevens:
naam txt = inloglijst.txt
naam sh = stacker.sh

inhoud inloglijst.txt: (2 regels!)

(lege regel!)
[Rooster], John Blom, Fredy Salomons, Roel Janssen, [QV-10],

inhoud stacker.sh (versie 2):

#!/bin/sh
mytext=`cat`
mytext2=`echo $mytext | sed 's/, /\n/g'`
counter=0
foreach x in $mytext2;do
  if [ `eval "$counter % 2"` -ne "0" ]; then
    echo -n "$x "
  else echo $x
  fi
  counter++
done
echo

Komt het door de lege regel dat ik die foutmelding krijg?

BertvdP

  • Gast
command line, kolommen maken
« Reactie #4 Gepost op: 2008/02/21, 10:18:49 »
Helpt het als je de eerste regel van je script verandert in "#!/bin/bash" ?

pbecks

  • Gast
command line, kolommen maken
« Reactie #5 Gepost op: 2008/02/21, 10:57:14 »
Gedaan. Reactie:

patrick@patrick-desktop:~/scripts/LANWAN$ cat /home/patrick/scripts/LANWAN/inloglijst.txt | /home/patrick/scripts/LANWAN/stacker.sh
/home/patrick/scripts/LANWAN/stacker.sh: line 5: syntaxfout nabij onverwacht symbool 'do'
/home/patrick/scripts/LANWAN/stacker.sh: line 5: `foreach x in $mytext2;do'

command line, kolommen maken
« Reactie #6 Gepost op: 2008/02/21, 11:06:13 »
zet eens een spatie tussen ; en do

pbecks

  • Gast
command line, kolommen maken
« Reactie #7 Gepost op: 2008/02/21, 11:06:19 »
BertvdP, hoe gebruik ik jouw scriptje? (hoe verwijs ik naar mijn tekstbestand)

pbecks

  • Gast
command line, kolommen maken
« Reactie #8 Gepost op: 2008/02/21, 11:09:23 »
Nunslaughter, heb ik net gedaan. Nog steeds dezelfde foutmelding.

patrick@patrick-desktop:~/scripts/LANWAN$ cat /home/patrick/scripts/LANWAN/inloglijst.txt | /home/patrick/scripts/LANWAN/stacker.sh
/home/patrick/scripts/LANWAN/stacker.sh: line 5: syntaxfout nabij onverwacht symbool 'do'
/home/patrick/scripts/LANWAN/stacker.sh: line 5: `foreach x in $mytext2; do'

command line, kolommen maken
« Reactie #9 Gepost op: 2008/02/21, 11:18:09 »
en als ge de ; wegdoet?

edit: ge moet ook niet steeds uw volledig pad ingeven...ik zie dat ge in de terminal al in de map ~/scripts/LANWAN zit...dus ge kunt gewoon dit typen:
cat inloglijst.txt | stacker.sh

BertvdP

  • Gast
command line, kolommen maken
« Reactie #10 Gepost op: 2008/02/21, 11:30:12 »
Citaat van: pbecks
BertvdP, hoe gebruik ik jouw scriptje? (hoe verwijs ik naar mijn tekstbestand)
Ik heb de perl operator <> gebruikt, en die leest zowel alle bestanden die je op de commandline meegeeft aan je script, als de standard input. Je kunt dus
cat input.txt | ./script.pldoen, of
./script.pl input.txtof ook
./script.pl < input.txtPerl staat voor Practical Extraction and Reporting Language, en is dus erg handig voor dit soort dingen.

BertvdP

  • Gast
command line, kolommen maken
« Reactie #11 Gepost op: 2008/02/21, 11:41:49 »
Citaat van: pbecks
inhoud inloglijst.txt: (2 regels!)

(lege regel!)
[Rooster], John Blom, Fredy Salomons, Roel Janssen, [QV-10],
Ik zie trouwens dat je input iets complexer is dan je eerst aangaf, en mijn script zal dat niet goed verwerken. Namen met spaties erin kun je opvangen door het gedeelte tussen de haakjes in de derde regel te vervangen door "/([\w ]+), ([\w ]+)/g".
Hoe wil je de woorden tussen [ ] interpreteren?

pbecks

  • Gast
command line, kolommen maken
« Reactie #12 Gepost op: 2008/02/21, 11:47:18 »
Hallo BertvdP,

Ik heb je scriptje gebruikt en krijg het volgende:

patrick@patrick-desktop:~/scripts/LANWAN$ ./stacker.pl inloglijst.txt
Blom    John
Ven     Fredy
Salomons        Roel
Janssen Ruud

inhoud van de inloglijst.txt is:

[Rooster], John Blom, John vd Ven, Fredy Salomons, Roel Janssen, Ruud Teutelink,

?

Er gaan dus 2 dingen mis 1) Omdat ik [ en ] gebruik in de inloglijst gaat er wat mis (kan ik zelf aanpassen)
2) De lijst zou er eigenlijk zo moeten komen uit te zien:

Rooster John Blom
John vd Ven Fredy Salomons
Roel Janssen Ruud Teutelink

Heb je nog ideeen?

pbecks

  • Gast
command line, kolommen maken
« Reactie #13 Gepost op: 2008/02/21, 11:57:26 »
Hallo,

1) Ik wil me eerst even excuseren voor het eten van 2 walletjes... :-) Maar jullie zijn zo behulpzaam, geweldig gewoon.

2) Ik heb de [ en ] verwijderd uit mijn inloglijst.txt, das een probleem minder.

Word vervolg.

BertvdP

  • Gast
command line, kolommen maken
« Reactie #14 Gepost op: 2008/02/21, 12:18:03 »
Citaat van: pbecks
1) Ik wil me eerst even excuseren voor het eten van 2 walletjes... :-) Maar jullie zijn zo behulpzaam, geweldig gewoon.
2) Ik heb de [ en ] verwijderd uit mijn inloglijst.txt, das een probleem minder.
1): Ik hoop dat je er iets van leert.

2): Tja, als het zo gemakkelijk is om je input aan te passen, m.a.w. die wordt niet automatisch gegeneerd door een closed source mainframe uit 1970, dan vraag ik me af waarom je überhaupt een script nodig hebt?

OK dan, nog een aanpassing:
#!/usr/bin/perl
while (<>) {
  if (/\[([\w ]+)\], ([\w ]+)/g) {
    print "$1\t$2\n";
    while (/ ([\w ]+), ([\w ]+)/g) {
      print "$1\t$2\n";
    }
  }
}
En nu snel naar de Perl documentatie voor het matchen van de tekst [QV-10]!

pbecks

  • Gast
command line, kolommen maken
« Reactie #15 Gepost op: 2008/02/21, 13:19:44 »
Citaat van: BertvdP
Citaat van: pbecks
1) Ik wil me eerst even excuseren voor het eten van 2 walletjes... :-) Maar jullie zijn zo behulpzaam, geweldig gewoon.
2) Ik heb de [ en ] verwijderd uit mijn inloglijst.txt, das een probleem minder.
1): Ik hoop dat je er iets van leert.

2): Tja, als het zo gemakkelijk is om je input aan te passen, m.a.w. die wordt niet automatisch gegeneerd door een closed source mainframe uit 1970, dan vraag ik me af waarom je überhaupt een script nodig hebt?

OK dan, nog een aanpassing:
#!/usr/bin/perl
while (<>) {
  if (/\[([\w ]+)\], ([\w ]+)/g) {
    print "$1\t$2\n";
    while (/ ([\w ]+), ([\w ]+)/g) {
      print "$1\t$2\n";
    }
  }
}
En nu snel naar de Perl documentatie voor het matchen van de tekst [QV-10]!
Hallo BertvdP,

1) Ik leer er voortdurend bij!
2) De input die ik zo makkelijk kan aanpassen word automatisch weer ingelezen door "Conky" (elke 5 minuten) dus het aanpassen van de input (layout) moet automatisch gebeuren. (via een script)

Ik heb je nieuwe pl-script uitgeprobeerd:

patrick@patrick-desktop:~/scripts/LANWAN$ ./stacker.pl inloglijst.txt
patrick@patrick-desktop:~/scripts/LANWAN$

(geen ouput!)


Ik weet veels te weinig van perl om er al iets van te kunnen maken.
(helaas)

BertvdP

  • Gast
command line, kolommen maken
« Reactie #16 Gepost op: 2008/02/21, 13:48:39 »
Het klopt dat je geen output krijgt als in je input de namen van de roosters niet meer tussen [ ] staan; want daar rekent deze versie op. Maar dan nog werkt het niet goed, en ik heb nu even geen tijd om dat verder uit te puzzelen. Wordt vervolgd.

command line, kolommen maken
« Reactie #17 Gepost op: 2008/02/21, 17:10:10 »
Probeer m'n script opnieuw, maar vervang foreach door for. Sorry, mijn fout, ben zeer fel foreach gewend van andere talen.

EDIT: dat wordt dus:

#!/bin/bash
mytext=`cat`
mytext2=`echo $mytext | sed 's/, /\n/g'`
counter=0
for x in $mytext2;do
  if [ `eval "$counter % 2"` -ne "0" ]; then
    echo -n "$x "
  else echo $x
  fi
  counter++
done
echo

Ik kan het zelfs zo maken dat je mijnscript.sh mijntext.txt in de command line kan typen:

#!/bin/bash
mytext=`cat $1`
mytext2=`echo $mytext | sed 's/, /\n/g'`
counter=0
for x in $mytext2;do
  if [ `eval "$counter % 2"` -ne "0" ]; then
    echo -n "$x "
  else echo $x
  fi
  counter++
done
echo
- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

BertvdP

  • Gast
command line, kolommen maken
« Reactie #18 Gepost op: 2008/02/21, 21:51:44 »
Citaat van: SeySayux
#!/bin/bash
Deze versie geeft bij mij als output

bert@floppy:~/ff$ ./script.sh ./script.sh: line 6: 0: opdracht niet gevonden
./script.sh: line 6: [: -ne: eenzijdige operator verwacht
[Rooster]
./script.sh: line 10: counter++: opdracht niet gevonden
./script.sh: line 6: 0: opdracht niet gevonden
./script.sh: line 6: [: -ne: eenzijdige operator verwacht
John
./script.sh: line 10: counter++: opdracht niet gevonden

Ik zal toch nog even kijken of ik een werkend perl alternatief kan bieden, want parsen in bash gaat mij ook niet zo goed af. Alleen weet ik nog steeds niet wat de syntax van de input precies is, en of de woorden tussen [ ] speciaal behandeld moeten worden. Dus daar ga ik wat aannames over maken.

command line, kolommen maken
« Reactie #19 Gepost op: 2008/02/22, 08:09:11 »
Dat is feitelijk vrij eenvoudig te verklaren. ++ dient normaal gezien als optellen, maar ik weet niet hoe het komt dat het niet herkent wordt??? Hmm... die bash doet moeilijk over interger waarden...

Voor de rest, -ne dient vervangen te worden door !=

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

pbecks

  • Gast
command line, kolommen maken
« Reactie #20 Gepost op: 2008/02/22, 09:27:18 »
Andere aanpak! (wel alvast bedankt voor het meedenken!)

Aangezien ik het onstaan van het bestand inloglijst.txt zelf regel mbv een al bestaand script (bash) is het alleen maar logisch dat ik in dat script probeer de output aan te passen. Dat doe ik nu met printf (zie onderstaand stukje uit het script)



#Check of bepaalde ws's zijn ingelogd.
if grep -i  "mn007mle" /home/patrick/scripts/LANWAN/host_alfa.txt
then
printf "%-s" "[Marleen_]" >> /home/patrick/scripts/LANWAN
/slotinloglijst.txt
else printf "%-s" "[________]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
fi
if grep -i  "mn005hev" /home/patrick/scripts/LANWAN/host_alfa.txt
then
printf "%-s"" [Hans_Eve]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
else printf "%-s\n" " [________]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
fi
if grep -i  "mn005rooster" /home/patrick/scripts/LANWAN/host_alfa.txt
then
printf "%-s" "[Rooster__]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
else printf "%-s" "[________]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
fi
if grep -i  "mn021jbl" /home/patrick/scripts/LANWAN/host_alfa.txt
then
printf "%-s\n" " [John_Blo]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
else printf  "%-s\n" " [________]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
fi
if grep -i  "mn032johnvdven" /home/patrick/scripts/LANWAN/host_alfa.txt
then
printf "%-s" "[John_vdv]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
else printf "%-s" "[________]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
fi
if grep -i  "mn024dbr" /home/patrick/scripts/LANWAN/host_alfa.txt
then
printf "%-s\n" " [Fredy____]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
else printf "%-s\n" " [________]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
fi
if grep -i  "mn031rjr" /home/patrick/scripts/LANWAN/host_alfa.txt
then
printf "%-s" "[Roel_Jans]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
else printf "%-s" "[________]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
fi
if grep -i  "mn032teu" /home/patrick/scripts/LANWAN/host_alfa.txt
then
printf "%-s\n" " [Ruud_Teut]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
else printf "%-s\n" " [________]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
fi
if grep -i  "mnqv10" /home/patrick/scripts/LANWAN/host_alfa.txt
then
printf "%-s" "[Qv10pc__]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
else printf "%-s" "[________]" >> /home/patrick/scripts/LANWAN/slotinloglijst.txt
fi

Zodoende krijg ik nu de volgende output (slotinloglijst.txt)


[________] [________]
[Rooster__] [________]
[________] [Fredy____]
[Roel_Jans] [Ruud_Teut]
[Qv10pc__]

(ik krijg geen schoonheidsprijs voor noch het script noch de output maar ja, ik heb wel wat ik wil)

Nogmaals jullie allebei bedankt voor de input!

command line, kolommen maken
« Reactie #21 Gepost op: 2008/02/22, 19:01:09 »
Nee, niet bepaald om trots op te zijn...
#!/bin/bash
mytext=`cat`
mytext2=`echo $mytext | sed 's/, /=/g' | sed 's/ /_/g' | sed 's/=/ /g'`
counter=0
for x in $mytext2;do
  if [ `expr $counter % 2` == "0" ]; then
    if [ $((`echo $x | sed 's/_/ /g' | wc -m | sed -E 's/ {6}([0-9]+)/\1/'`)) -lt 8 ]; then
      echo -ne `echo $x | sed 's/_/ /g'`"\t""\t"
    else
      echo -ne `echo $x | sed 's/_/ /g'`"\t"
    fi
  else echo `echo $x | sed 's/_/ /g'`
  fi
  let counter++
done
Maar dit wel :D

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net