如何只用连字符连接某些字段?

时间:2009-07-21 06:46:32

标签: perl concatenation

输入:

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脚本可以做到这一点?

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

这个答案假设这些字段已经分成变量$ F1 .. $ F6。如果数据是单个字符串,那么正则表达式的答案更合适。

答案 2 :(得分:3)

输入看起来有点固定宽度y,表示packunpack

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, '-' );

答案 3 :(得分: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);

答案 4 :(得分:1)

如果格式具有固定的列宽:

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

否则就像:

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

答案 5 :(得分:0)

直接在命令行中:

$ 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

请记住,这相当于put:

#!/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];
}