Toon posts:

ksh script: text van lowercase naar uppercase

Pagina: 1
Acties:
  • 255 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb bestandje met een fixed length bestands indeling.

Jantje    straat 12     5221PP
keesje    Straat 2      3222KK
jos       dreefsingel 1 5588JJ


Nu ben ik op zoek naar een unix commando (ksh) om alles van positie 11 t/m 25 naar uppercase te zetten.

Ik ben zelf aan de slag gegaan met sed. Maar hier kon ik (volgens mij althans) niet een bepaalde range opgeven maar alleen een woord dat vervangen moet worden.

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
code:
1
ruby -pe '$_[10,15] = $_[10,15].upcase' bestandje.txt

Iets dergelijks is ook wel in Perl/Python te maken natuurlijk (maar Ruby is toevallig mijn keuze).

of met awk:
code:
1
awk 'BEGIN{FIELDWIDTHS="10 15 99"};{print $1 toupper($2) $3}' bestandje.txt

Ik geloof echter dat FIELDWIDTHS niet 'standaard' awk is, dus wellicht moet je gawk gebruiken.

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Topicstarter
Er staat geen gawk bij ons op het systeem. Ik denk ook niet dan onze beheerder dit er op wil zetten.
Ik ga eens kijken of ik iets met perl kan beginnen.
Bedankt voor je reactie .

Verwijderd

Topicstarter
Met mijn niet bestaande perl kennis ben ik tot dit gekomen
Perl:
1
2
3
4
5
6
7
8
9
10
open(FILE, $ARGV[0]);
@lines = <FILE>;
close(FILE);
foreach (@lines) {
    my $start =$ARGV[1] ;
    my $stop =$ARGV[2] ;
    print substr($_,0,$start - 1);
    print substr(uc($_),$start,$stop);
    print substr($_,$stop+1);
}


Aan _Squatt_ zijn ruby code te zien zou je bijna zeggen dat het korter kan ;)

Het werkt ook nog niet helemaal lekker :(

[ Voor 5% gewijzigd door Verwijderd op 07-11-2007 16:46 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:10
OS specifieke scripts / batch-scripts horen in het bijhorende OS forum thuis.
>NOS

https://fgheysels.github.io/


  • Japius
  • Registratie: April 2003
  • Laatst online: 02-01 22:04
euh... Deze tips haal ik uit de vierde hit van Google

Verwijderd

Ik zou er eerst ff 3 files van maken... bv. met het commando: split

Dan wil je dus het middelste veld uppercase maken als ik het begrijp, dat kan met het commando: tr

Daarna de bestanden samenvoegen met het commando: paste

ff de man pages lezen van deze 3 commando's en dan moet je er wel uitkomen denk ik

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
split is om "horizontaal" te splitten volgens mij. Ik denk dat je "cut" bedoelt.

Dus zoiets:
code:
1
2
3
4
5
cat bestand|cut -b  -11 > kol1
cat bestand|cut -b  12-25 > kol2
cat bestand|cut -b  26- > kol3
cat kol2 |tr [:lower:] [:upper:] > kol2_upper
paste kol1 kol2_upper kol3 > nieuwbestand

[ Voor 58% gewijzigd door u_nix_we_all op 07-11-2007 17:10 ]

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


Verwijderd

split is om "horizontaal" te splitten volgens mij. Ik denk dat je "cut" bedoelt.
Je hebt gelijk... had het ook niet gechecked.... schreef het zo ff snel op. Waar het me meer om ging was om duidelijk te maken dat je er ook 3 bestanden van kon maken.

  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
Verwijderd schreef op woensdag 07 november 2007 @ 16:36:
Met mijn niet bestaande perl kennis ben ik tot dit gekomen
Perl:
1
..knip..


Het werkt ook nog niet helemaal lekker :(
Regel 9 klopt niet. Omdat $stop de lengte van het segment is en niet de laatste positie print je nu teveel tekens ($start teveel). Vervang regel 9 door:
Perl:
9
print substr($_, $start + $stop + 1);
Aan _Squatt_ zijn ruby code te zien zou je bijna zeggen dat het korter kan ;)
code:
1
perl -pe 'substr($_, 10, 25) = uc(substr($_,10,25))' bestandje.txt

Doet hetzelfde als de ruby versie. Het lijkt voornamelijk zo kort omdat de '-p' optie het inlezen en printen automatisch doet :).

"He took a duck in the face at two hundred and fifty knots."


Verwijderd

Ja idd, het staat allemaal netjes in de man page. Maar uh alstu :p

code:
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/ksh

while read line
do
    col1=${line:0:11}
    typeset -u col2=${line:11:25}
    col3=${line:25}

    echo "${col1}${col2}${col3}"
done < test.txt > output.test


edit:

scriptje volledig gemaakt

[ Voor 12% gewijzigd door Verwijderd op 07-11-2007 19:53 ]

Pagina: 1