Как я могу объединить только некоторые поля с дефисом? - PullRequest
2 голосов
/ 21 июля 2009

Введите:

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 ]

4 голосов
/ 21 июля 2009
s/(\d{8})\s+(\d{2}:\d{2}:\d{2})/$1-$2/
3 голосов
/ 21 июля 2009

Ввод выглядит как фиксированная ширина-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, '-' );
3 голосов
/ 21 июля 2009
printf("%-4s%s %s %s-%s  %s\n", $F1, $F2, $F3, $F4, $F5, $F6);

Этот ответ предполагает, что поля уже разбиты на переменные $ F1 .. $ F6. Если данные представляют собой одну строку, то регулярное выражение является более подходящим.

1 голос
/ 22 июля 2009

Если формат с фиксированной шириной столбца:

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

В противном случае что-то вроде:

perl -ane'printf"%-4s%s %s %s-%s  %s\n",@F'
1 голос
/ 21 июля 2009
$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);
0 голосов
/ 21 июля 2009

Непосредственно в командной строке:

$ 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...