如何从文件中打印行到单独的文件

时间:2013-08-14 12:36:51

标签: perl

我有一个包含这样的行的文件:

1       107275  447049 scaffold1443     465     341154  -

有几行以1开头,之后空白行分隔并以2开始行,依此类推。 我想根据它们的数量将这些行分成不同的文件。 我写了这个脚本,但它只在第一行打印在每个文件中。

#!/usr/bin/perl
#script for choosing chromosome
use strict;

my $filename= $ARGV[0];
open(FILE, $filename);
while (my $line = <FILE>) {
my @data = split('\t', $line);
my $length = @data;
#print $length;
my $num = $data[0];
if ($length ==  6) {
open(my $fh, '>', $num);
print $fh $line;
}
$num = $num + 1;
}

拜托,我需要你的帮助!

2 个答案:

答案 0 :(得分:3)

使用>>打开文件以追加到它的末尾,因为>总是将所需文件截断为零字节,

use strict;

my $filename = $ARGV[0];
open(my $FILE, "<", $filename) or die $!;
while (my $line = <$FILE>) {
  my @data = split('\t', $line);
  my $length = @data;
  #print $length;
  my $num = $data[0];
  if ($length ==  6) {
    open(my $fh, '>>', $num);
    print $fh $line;
  }
  $num = $num + 1;
}

答案 1 :(得分:0)

如果我理解你的问题,那么段落模式可能会有用。这打破了两条或更多条新线的记录,而不只是一条:

@ARGV or die "Supply a filename\n";
my $filename= $ARGV[0];

local $/ = "";    # Set paragraph mode
open(my $file, $filename) or die "Unable to open '$filename' for read: $!";

while (my $lines = <$file>) {

    my $num = (split("\t", $lines))[0];

    open(my $fh, '>', $num) or die "Unable to open '$num' for write: $!";
    print $fh $lines;
    close $fh;
}

close $file;