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);
入力pack
とunpack
を示唆している固定幅-Yの種類に見えます。それが十分に固定されます場合
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];
}
フォーマットがfixed co lumn幅:そうでなければ
perl -pe'substr$_,34,1,"-"'
のようなもの:
perl -ane'printf"%-4s%s %s %s-%s %s\n",@F'
+1(私は短い方法があることを知っていた!) –
質問の興味深いことに異なる解釈。もちろん、自動分割モードのように意図されたF [0] .. $ F [5]でもかまいません。 –
@chaos:私は同じことをポストしようとしていた。 :-) –