輸入:如何只連字符連字符?
F1 F2 F3 F4 F5 F6
4 ABCDEF1234 1111111111 20090101 00:00:00 XYZ 123
輸出:
4 ABCDEF1234 1111111111 20090101-00:00:00 XYZ 123
F代表字段。 F4和F5是需要與連字符連接的日期字段。有沒有一個快速的Perl腳本來做到這一點?
輸入:如何只連字符連字符?
F1 F2 F3 F4 F5 F6
4 ABCDEF1234 1111111111 20090101 00:00:00 XYZ 123
輸出:
4 ABCDEF1234 1111111111 20090101-00:00:00 XYZ 123
F代表字段。 F4和F5是需要與連字符連接的日期字段。有沒有一個快速的Perl腳本來做到這一點?
printf("%-4s%s %s %s-%s %s\n", $F1, $F2, $F3, $F4, $F5, $F6);
這個答案假定這些字段已經被分成變量$ F1 .. $ F6。如果數據是單個字符串,那麼正則表達式的答案是更接近適當的。
s/(\d{8})\s+(\d{2}:\d{2}:\d{2})/$1-$2/
$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);
輸入看起來種固定寬度-y即表明pack
和unpack
的。
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);
話又說回來,如果是固定的話,你可以去:
substr($input_line, 34, 1, '-');
直接在命令行:
$ 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
請記住,這相當於把:
#!/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];
}
如果格式是固定的co lumn寬度:
perl -pe'substr$_,34,1,"-"'
否則類似:
perl -ane'printf"%-4s%s %s %s-%s %s\n",@F'
有趣的是不同的解釋的問題。當然,它也可能是F [0] .. $ F [5]的意圖,與自動分割模式一樣。 – 2009-07-21 06:54:18
@chaos:我即將發佈相同內容。 :-) – 2009-07-21 14:41:51