尽管我很震惊,但我无法在任何地方找到这一点,而且我的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
甚至更奇怪的是,我抓住了primes.txt(原文)和“^ 004437”无处可寻。这是bash的某种限制吗?
更新:解决方案
这似乎是某种限制,我真的不知道是什么。我正在重新选择perl脚本作为我的答案,因为它不仅可以工作,而且还可以在~80秒内从零开始创建~2GB并包含额外的素数。 Go here解决了bash错误。
答案 0 :(得分:4)
$ perl -lne 'print; last if $_ > 2**32' < myprimes.txt > myprimes2.txt
为您提供输入系列的素数,最多可达到2 ** 32之前的素数,然后停止。不将源文件读入内存。
答案 1 :(得分:3)
在shell中,不将整个13亿个数字加载到内存中,您可以使用:
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
答案 2 :(得分:2)
在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]
答案 3 :(得分:0)
我建议在Perl中做这样的事情:
编辑:嗯,这可能是用尽所有内存的数组 - 这应该对你的资源更友好。
#!/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"; }
}