从文件中读取数字,直到行<N(Read numbers from file until lin

2019-10-17 11:11发布

至于震惊,因为我,我找不到任何地方这样的,我的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的错误。

Answer 1:

$  perl -lne 'print; last if $_ > 2**32' < myprimes.txt > myprimes2.txt

让你输入串联素数高达一个黄金近2 ** 32,然后停止。 不读的源文件到内存中。



Answer 2:

在外壳,而无需加载整个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


Answer 3:

这是很容易的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]


Answer 4:

我会建议在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"; }
}


文章来源: Read numbers from file until line < n
标签: linux bash