2016-08-08 94 views
0

我在嘗試將大文本文件拆分爲多個文本文件。我在幾年前發現了另一個線索,其中有一個非常相似的前提,但找不到確切的情況。使用Perl進行文件拆分

https://unix.stackexchange.com/a/64691/183674

我多麼分裂以下數據,如果第一行沒有以00開始:00:00:00?

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 

下面是引用代碼:

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

我試圖while語句後的下一行加入print $line;試圖使其逐行讀取如圖其他教程但這並不糾正這個問題。

我將不勝感激任何輸入。

編輯:那麼對於像

00:01:16:17 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 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 

丟棄的前​​三行。

+1

您如何期待文件被拆分? –

+0

我希望代碼爲00:00:00:00的每一處出現一個文件,在下一個實例之前結束。如果所有具有00:00:00:00的行都向下移動幾行,我將如何執行此操作? – wittywater

+1

您的預期產出是多少? – ssr1012

回答

1

在這樣的循環中修改條件不是做這個工作嗎?

if ($line =~ /^00:00:00:00/ || !$outfh) 

假設第一行不啓動00:00:00:00( '零標記')。正則表達式匹配失敗,但文件未打開,因此|| !$outfh條件成立。 if正文中的代碼跳過關閉並打開新文件,並將該行寫入新文件。此後,檔案是開放的,所以條件的後半部分不會改變決策制定(除非將其放慢,可能無法衡量)。

自從我第一次提供我的解決方案以來,問題得到了澄清。如果要放棄第一個零標記之前的行,請僅在文件句柄打開的情況下修改打印以打印(而不是在第一行不以零標記開始時修改打開文件的條件)。

print $outfh $line or die "Failed to write to file: $!" if $outfh; 
+0

它正在與你提出的改變,現在我只需要了解第二個條件的意義:) – wittywater

+0

假設第一行開始01.正則表達式匹配失敗,但文件未打開,所以或條件爲真。代碼跳過關閉並打開新文件並寫入該行。此後,文件被打開,所以條件的後半部分不會改變決策制定(除非將其放慢,可能無法衡量)。 –

+0

這說明了我的困惑,我很感激幫助。 – wittywater