
次の内容を含むABC_TabDelim.txtファイルがあります。
00:00:00:00 00:00:05:00 01SC_001.jpg
00:00:14:29 00:00:19:29 01SC_002.jpg
00:01:07:20 00:01:12:20 01SC_003.jpg
00:00:00:00 00:00:03:25 02MI_001.jpg
00:00:03:25 00:00:08:25 02MI_002.jpg
00:00:35:27 00:00:40:27 02MI_003.jpg
00:00:00:00 00:00:05:00 03Bi_001.jpg
00:00:05:19 00:00:10:19 03Bi_002.jpg
00:01:11:17 00:01:16:17 03Bi_003.jpg
00:00:00:00 00:00:05:00 04CG_001.jpg
00:00:11:03 00:00:16:03 04CG_002.jpg
00:01:12:25 00:01:17:25 04CG_003.jpg
00:00:00:00 インスタンスごとに複数のファイルに分割し、ABC01_TabDelim.txt、ABC02_TabDelim.txt、ABC03_TabDelim.txtなどで出力したいと思います。
したがって、00:00:00:00 は、新しいファイルを開始する必要があることを意味します。 Perlスクリプトを使用してこれを行う方法はありますか?
答え1
これは与えられた形式で動作します。これは、ファイルが常に00:00:00:00で始まると仮定します。
#!/usr/bin/env perl
use strict;
use warnings;
open(my $infh, '<', 'ABC_TabDelim.txt') or die $!;
my $outfh;
my $filecount = 0;
while ( my $line = <$infh> ) {
if ( $line =~ /^00:00:00:00/ ) {
close($outfh) if $outfh;
open($outfh, '>', sprintf('ABC%02d_TabDelim.txt', ++$filecount)) or die $!;
}
print {$outfh} $line or die "Failed to write to file: $!";
}
close($outfh);
close($infh);
答え2
ここです。エラーチェックなしで次のように実行します。perl split file-to-munge
修正する:スクリプトのクリーンアップについては、Goldilocksのアドバイスに従ってください。
#!/usr/bin/perl
$n = 1;
while(<>) {
if(/^00:00:00:00/) {
close($out) if(n != 1);
$fn = sprintf("ABC%02d_TabDelim.txt", $n++);
open($out, ">", "$fn");
}
print OUT;
}
答え3
このサンプル入力の出力が4つのファイルであると予想される場合、各ファイルには3つの行があり、各行の最初の行は「00:00:00:00」で始まり、残りの2つの行は次のようになります。
perl -ne 'if(/^[0:]{11}/){close F if$f;open F,sprintf(">ABC%02d_TabDelim.txt",++$f)}print F' ABC_TabDelim.txt
答え4
awkを使用して実装できる1つの方法、Perlソリューションがあります。
awk '/00:00:00:00/ { out = sprintf("ABC%02d_TabDelimit.txt", ++i) } { print > out }' ABC_TabDelim.txt
分割する必要がある場合たくさん各ファイルが進行中に閉じられるようにするには、sprintf関数の前に次を追加しますif(out) close(out)
。
awk '/00:00:00:00/ { if(out) close(out); out = sprintf("ABC%02d_TabDelimit.txt", ++i) } { print > out }' ABC_TabDelim.txt