至于震惊,因为我,我找不到任何地方这样的,我的bash技能仍然低于平均水平。
我素数的文本文件:
2 \ n
3 \ n
5 \ n
7 \ n
11 \ n
等等...
我想拉在2 ^ 32(4294967296) 加上一个额外的素数的所有素数,而这些素数保存到自己的文本文件格式相同的方式。 另外,我的文件刚刚超过13条十亿线至今,所以限制后停止将是理想的。
更新:问题。
在bash脚本已经通过循环相当长的一段时间,这些11个数字无我注意到:
4232004449
4232004479
4232004493
4232004509
4232004527
4232004533
4232004559
4232004589
4232004593
4232004613
004437
什么是更加古怪的是我grepped primes.txt(原件),并无处可寻“^ 004437”。 这是某种形式的bash的限制?
更新:解决方案
这似乎是某种东西的限制,我真的不知道是什么。 我重新艇员选拔Perl脚本作为我的答案,因为它不仅工作,但它从没有在〜80秒创建〜2GB,其中包括额外的素数。 去这里的一个解决bash的错误。
$ perl -lne 'print; last if $_ > 2**32' < myprimes.txt > myprimes2.txt
让你输入串联素数高达一个黄金近2 ** 32,然后停止。 不读的源文件到内存中。
在外壳,而无需加载整个1.3十亿数到内存中,你可以使用:
n=4294967296
last=0
while read number
do
if [ $last -gt $n ]
then break
fi
echo $number
last=$number
done < primes.txt > primes2.txt
你可能会失去了last
变数太多:
n=4294967296
while read number
do
echo $number
if [ $number -gt $n ]
then break
fi
done < primes.txt > primes2.txt
这是很容易的Bash呢! 只是猫文件primes.txt读它,经过每个数字,检查数小于2 ^ 32,如果是,追加它primes2.txt。
确切的代码如下。
#!/bin/bash
n=4294967296; # 2^32
for i in `cat primes.txt`
do
if [ $i -le $n ]
then
echo $i >> primes2.txt;
fi
done
或者你可以用这个简单的Python的解决方案,它不需要将整个文件加载到内存中。
new_primes = open('primes2.txt', 'a')
n = 2**32
[new_primes.write(p) for p in open('primes.txt', 'r') if int(p) < n]
我会建议在Perl做这样的事情:
编辑 :嗯,这很可能是用完了所有的RAM阵列-这应该是比较友好的资源。
#!/usr/bin/env perl
use warnings;
use strict;
my $max_value = ( 2 ** 32);
my $input_file = 'primes.txt';
my $output_file = 'primes2.txt';
open( my $INPUT_FH, '<', $input_file )
or die "could not open file: $!";
open ( my $OUTPUT_FH, '>', $output_file )
or die "could not open file: $!";
foreach my $prime ( <$INPUT_FH> ) {
chomp($prime);
unless ( $prime >= $max_value ) { print $OUTPUT_FH "$prime","\n"; }
}