|
| lidt manipulering Fra : Lars L. Christensen |
Dato : 25-04-01 19:33 |
|
How do I do this...??
Jeg har en backupfil fra en database, hvor hver kolonne er separeret af en tab (\t).
Jeg skal have flyttet lidt rundt på kolonnerne, da den gamle og den nye database ikke er designet ens.
Jeg har 5 felter, der er placeret som:
felt_a felt_c felt_b felt_d felt_e
De skulle gerne komme til at stå i rækkefølge, men hvordan gør jeg dette nemmest?
(det er nok noget med nogle regulære expressions, men jeg kan ikke lige få det til at virke)
mvh
Lars Christensen
| |
Peter Makholm (25-04-2001)
| Kommentar Fra : Peter Makholm |
Dato : 25-04-01 19:37 |
|
"Lars L. Christensen" <news@lc-data.dk> writes:
> felt_a felt_c felt_b felt_d felt_e
@fields = split /\t/, $line;
$newline = join "\t", $fields[0], $fields[2], $fields[1], $fields[3], $fields[4];
--
hash-bang-slash-bin-slash-bash
| |
Lars L. Christensen (25-04-2001)
| Kommentar Fra : Lars L. Christensen |
Dato : 25-04-01 20:20 |
|
"Peter Makholm" <peter@makholm.net> skrev i en meddelelse news:874rvcu8r3.fsf@xyzzy.adsl.dk...
> "Lars L. Christensen" <news@lc-data.dk> writes:
>
> > felt_a felt_c felt_b felt_d felt_e
>
>
> @fields = split /\t/, $line;
> $newline = join "\t", $fields[0], $fields[2], $fields[1], $fields[3], $fields[4];
Du kan vel ikke tilfældigvis den samme kommando, så jeg lan lave den direkte fra kommandolinien?
Jeg skulle formatrere det ene felt, som indeholder en dato, og det blev lavet med:
perl -pe 's#(\d{2})/(\d{2})/(\d{4})#\3/\2/\1#g' < fil.input > fil.output
Sådan noget i den stil...
mvh
Lars
| |
Peter Makholm (25-04-2001)
| Kommentar Fra : Peter Makholm |
Dato : 25-04-01 20:59 |
|
"Lars L. Christensen" <news@lc-data.dk> writes:
> > @fields = split /\t/, $line;
> > $newline = join "\t", $fields[0], $fields[2], $fields[1], $fields[3], $fields[4];
>
> Du kan vel ikke tilfældigvis den samme kommando, så jeg lan lave den direkte fra kommandolinien?
Joda:
perl -pi.bak -e '@f = split /\t/; $_ = join "\t", $f[0], $f[2], $f[1], $f[3], $f[4];' <filnavn>
Kan du se ligheden?
--
hash-bang-slash-bin-slash-bash
| |
Trond Michelsen (26-04-2001)
| Kommentar Fra : Trond Michelsen |
Dato : 26-04-01 21:22 |
|
Peter Makholm <peter@makholm.net> skrev i
meldingsnyheter:87u23csqcg.fsf@xyzzy.adsl.dk...
> "Lars L. Christensen" <news@lc-data.dk> writes:
>
> > > @fields = split /\t/, $line;
> > > $newline = join "\t", $fields[0], $fields[2], $fields[1], $fields[3],
$fields[4];
> >
> > Du kan vel ikke tilfældigvis den samme kommando, så jeg lan lave den
direkte fra kommandolinien?
>
> Joda:
>
> perl -pi.bak -e '@f = split /\t/; $_ = join "\t", $f[0], $f[2], $f[1],
$f[3], $f[4];' <filnavn>
og... siden Perl er så godt som spesiallaget for onelinere, så finnes det
selvfølgelig switches for å gjøre dette enklere..
-a = autosplit. Splitter til @F.
-F = tegnet det skal splittes på.
I tillegg synes ihvertfall jeg at en slice er lettere å lese enn å liste opp
en rekke arrayelementer
perl -F/\\t/ -api.bak -e '$_ = join "\t", @F[0,2,1,3,4]' <filnavn>
Men, siden det ikke chompes, så vil dette bare virke dersom siste element
fortsatt brukes som det siste.
Hvis element 3 og 4 bytter plass, så må man gjøre noe slikt:
perl -l -F/\\t/ -api.bak -e 'chomp $F[-1];$_ = join "\t", @F[0,2,1,4,3]'
<filnavn>
eller slik (uten -a):
perl -l -pi.bak -e 'chomp;$_ = join "\t", (split /\t/)[0,2,1,4,3]' <filnavn>
--
Trond Michelsen
| |
|
|