2016-05-27 5 views
0

大きなテキストファイルがあります。 n行をランダムに選択し、元のファイルから削除して新しいファイルに入れたいとします。オリジナルのテキストファイルからランダムな行を選択して、新しいファイルに貼り付けます。

解決策はhereですが、元のファイルから行を削除しません。

おかげ

+0

行を削除するためにこれを使用http://stackoverflow.com/questions/5410757/delete-lines-in-a-text-file-that-c​​ontaining- a-specific-string – piyushj

+0

@piyush複数の行を削除しません – GMichael

答えて

2

100万行を含むファイルを作成します。

sample_size.pl

#!/usr/bin/env perl 

use warnings; 
use strict; 

my ($filename, $n) = @ARGV; 
$filename 
    or die "usage: $0 filename sample_size"; 

-f $filename 
    or die "Invalid filename '$filename'"; 
chomp(my ($word_count_lines) = `/usr/bin/wc -l $filename`); 
my ($lines, undef) = split /\s+/, $word_count_lines; 

die "Need to pass in sample size" 
    unless $n; 
my $sample_size = int $n; 

die "Invalid sample size '$n', should in the between [ 0 - $lines ]" 
    unless (0 < $sample_size and $sample_size < $lines); 

# Pick some random line numbers 
my %sample; 
while (keys %sample < $sample_size) { 
    $sample{ 1+int rand $lines }++; 
} 

open my $fh, $filename 
    or die "Unable to open '$filename' for reading : $!"; 

open my $fh_sample, "> $filename.sample" 
    or die "Unable to open '$filename.sample' for writing : $!"; 
open my $fh_remainder, "> $filename.remainder" 
    or die "Unable to open '$filename.remainder' for writing : $!"; 

my $current_fh; 
while (<$fh>) { 
    my $line_number = $.; 
    $current_fh = $sample{ $line_number } ? $fh_sample : $fh_remainder; 
    # Write to correct file 
    print $current_fh $_; 
} 
close $fh 
    or die "Unable to finish reading '$filename' : $!"; 
close $fh_sample 
    or die "Unable to finish writing '$filename.sample' : $!"; 
close $fh_remainder 
    or die "Unable to finish writing '$filename.sample' : $!"; 

print "Original file '$filename' has $lines rows\n"; 
print "Created '$filename.sample' with $sample_size rows\n"; 
print "Created '$filename.remainder' with " . ($lines - $sample_size) . " rows\n"; 
print "Run 'mv $filename.remainder $filename' if you are happy with this result\n"; 
:ここ

perl -e 'for (1..1000000) { print "line $_ - and some data_$_\n" }' > large_file 

は、大容量のファイルをサンプリングするperlスクリプトです

スクリプトを実行する

$ perl ./sample_size.pl large_file 10 

出力

Original file 'large_file' has 1000000 rows 
Created 'large_file.sample' with 10 rows 
Created 'large_file.remainder' with 999990 rows 
Run 'mv large_file.remainder large_file' if you are happy with this result 
関連する問題