2009-07-21 3 views
2

입력 :일부 필드 만 하이픈으로 연결할 수 있습니까?

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 스크립트가 있습니까?

답변

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

이 답변은 필드가 이미 $ F1 .. $ F6 변수로 분할되어 있다고 가정합니다. 데이터가 단일 문자열이면 정규식 응답이 더 적절합니다.

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

흥미롭게도 다른 해석. 물론 자동 분리 모드와 마찬가지로 의도 된 F [0] .. $ F [5] 일 수도 있습니다. –

+0

@ chaos : 나는 똑같이 올리려고하고 있었다. :-) –

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

입력은 packunpack 제안 고정 폭 (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, '-'); 
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 

이가 넣어 동등 기억
#!/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

형식이 fixed co lumn 폭 : 같은

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

그렇지 않으면 뭔가 : 질문의

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

+1 (나는 더 짧은 길이 있다는 것을 알고 있었다!) –

관련 문제