1

私と同じくらいショックを受けていますが、これはどこにも見つかりません。私の bash スキルはまだ標準以下です。

素数のテキスト ファイルがあります。

2\n
3\n
5\n
7\n
11\n
など...

2^32 (4294967296)と 1 つの追加の素数 の下にあるすべての素数を取得し、これらの素数を同じ方法でフォーマットされた独自のテキスト ファイルに保存します。また、これまでのファイルの行数は 13 億行をわずかに超えているため、上限に達したら停止するのが理想的です。

更新: 問題。

bash スクリプトは、私が気付かないうちに、これらの 11 個の番号をかなり長い間ループしています。

4232004449
4232004479
4232004493
4232004509
4232004527
4232004533
4232004559
4232004589
4232004593
4232004613
004437

さらに奇妙なのは、primes.txt (オリジナル) を grep したところ、"^004437" がどこにも見つからなかったことです。これはbashの何らかの制限ですか?

更新: 解決策

何かの制限のように見えますが、実際にはわかりません。私は答えとしてperlスクリプトを再選択しています. bash エラーの解決策については、こちらを参照してください。

4

4 に答える 4

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

素数の入力系列を 2**32 を過ぎた 1 つの素数まで与えてから停止します。ソース ファイルをメモリに読み込みません。

于 2012-12-06T04:30:35.973 に答える
3

シェルでは、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
于 2012-12-06T04:32:47.453 に答える
2

This is very easy to do in Bash! Just cat the file primes.txt to read it, go through each number, check that the number is less than 2^32, and if it is, append it to primes2.txt.

The exact code is below.

#!/bin/bash

n=4294967296; # 2^32

for i in `cat primes.txt`
do
        if [ $i -le $n ]
        then
                echo $i >> primes2.txt;
        fi
done

Or you can use this simple Python solution, which does not require loading the entire file into memory.

new_primes = open('primes2.txt', 'a')
n = 2**32

[new_primes.write(p) for p in open('primes.txt', 'r') if int(p) < n]
于 2012-12-06T04:18:06.057 に答える
0

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"; }
}
于 2012-12-06T04:11:10.380 に答える