从文件读取数字直到行< ñ

时间:2012-12-06 04:01:07

标签: linux bash

尽管我很震惊,但我无法在任何地方找到这一点,而且我的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错误。

4 个答案:

答案 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"; }
}