2009-07-21 9 views
2

Input:Wie kann ich nur einige Felder mit einem Bindestrich verketten?

F1 F2   F3   F4  F5  F6 

4 ABCDEF1234 1111111111 20090101 00:00:00 XYZ 123 

Output:

4 ABCDEF1234 1111111111 20090101-00:00:00 XYZ 123 

F darstellt Feldern. F4 und F5 sind Datumsfelder, die mit einem Bindestrich verkettet werden müssen. Gibt es ein schnelles Perl-Skript, das das tut?

Antwort

3
printf("%-4s%s %s %s-%s %s\n", $F1, $F2, $F3, $F4, $F5, $F6); 

Diese Antwort setzt voraus, dass die Felder bereits in die Variablen $ F1 .. $ F6 aufgeteilt sind. Wenn die Daten eine einzelne Zeichenfolge sind, ist die Regex-Antwort eher geeignet.

4
s/(\d{8})\s+(\d{2}:\d{2}:\d{2})/$1-$2/ 
+0

Interessanter unterschiedliche Auslegung der Frage. Natürlich könnte es auch F [0] .. $ F [5] sein, wie beim Autosplit-Modus. –

+0

@chaos: Ich wollte das selbe posten. :-) –

1
$str = "4 ABCDEF1234 1111111111 20090101 00:00:00 XYZ 123"; 
@s = split /\s/,$str; 
$s[5] = join("-",$s[5],$s[6]); 
splice(@s,6,1); 
print join(" ",@s); 
3

Der Eingang sieht Art von fester Breite-y, die pack und unpack vorschlägt.

my @F = unpack('A4 A11 A11 A19 A7', $input_line); 
$F[3] =~ s/\d\K\s+/-/; # Use lookaround (?<=\d) if \K is not available 
my $line = pack('A4 A11 A11 A19 A7', @F); 

Dann wieder, wenn es genug befestigt ist, können Sie einfach gehen:

substr($input_line, 34, 1, '-'); 
0

direkt in der Kommandozeile:

$ perl -n -e '@fields = split; printf "%s %s %s %s-%s %s %s\n", $fields[0], $fields[1], $fields[2], $fields[3], $fields[4], $fields[5]' input.txt > output.txt 

Denken Sie daran, dass dies äquivalent zu setzen:

#!/usr/bin/perl -w 
while (<>) { 
    @fields = split; 
    printf "%s %s %s %s-%s %s %s\n", $fields[0], $fields[1], $fields[2], $fields[3], $fields[4], $fields[5]; 
} 
1

Wenn das Format mit festen co ist lumn Breite:

perl -pe'substr$_,34,1,"-"' 

sonst so etwas wie:

perl -ane'printf"%-4s%s %s %s-%s %s\n",@F' 
+0

+1 (Ich wusste, dass es einen kürzeren Weg gab!) –

Verwandte Themen