Linux 从文件中读取数字,直到第行<;N

Linux 从文件中读取数字,直到第行<;N,linux,bash,Linux,Bash,虽然我很震惊,但我在任何地方都找不到这个,而且我的bash技能仍然低于标准 我有一个素数的文本文件: 2\n 3\n 5\n 7\n 11\n 等等 我想把2^32(4294967296)下的所有素数加上一个额外的素数,并将这些素数保存到自己的文本文件中,格式相同。另外,到目前为止,我的文件的行数刚刚超过13亿行,因此在限制之后停止将是理想的 更新:问题。 bash脚本在这11个数字之间循环了很长一段时间,我没有注意到: 423200449 4232004479 4232004493 42320

虽然我很震惊,但我在任何地方都找不到这个,而且我的bash技能仍然低于标准

我有一个素数的文本文件:

2\n
3\n
5\n
7\n
11\n
等等

我想把2^32(4294967296)下的所有素数加上一个额外的素数,并将这些素数保存到自己的文本文件中,格式相同。另外,到目前为止,我的文件的行数刚刚超过13亿行,因此在限制之后停止将是理想的

更新:问题。

bash脚本在这11个数字之间循环了很长一段时间,我没有注意到:

423200449
4232004479
4232004493
4232004509
4232004527
4232004533
4232004559
4232004589
4232004593
4232004613
004437

更奇怪的是,我在primes.txt(原件)上打了个灰,却找不到“^004437”。这是bash的某种限制吗

更新:解决方案


这似乎是某种限制,我真的不知道是什么。我之所以重新选择perl脚本作为我的答案,是因为它不仅有效,而且在大约80秒内从无到有地创建了~2GB,并包含了额外的素数。对于bash错误的解决方案。

我建议在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"; }
}
#/usr/bin/env perl
使用警告;
严格使用;
我的$max_值=(2**32);
我的$input_文件='primes.txt';
我的$output_文件='primes2.txt';
打开(我的$INPUT\U FH,,$output\U文件)
或“无法打开文件:$!”;
foreach我的$prime(){
chomp($prime);
除非($prime>=$max_value){print$OUTPUT_FH“$prime”,“\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"; }
}
#/usr/bin/env perl
使用警告;
严格使用;
我的$max_值=(2**32);
我的$input_文件='primes.txt';
我的$output_文件='primes2.txt';
打开(我的$INPUT\U FH,,$output\U文件)
或“无法打开文件:$!”;
foreach我的$prime(){
chomp($prime);
除非($prime>=$max_value){print$OUTPUT_FH“$prime”,“\n”}
}

这在Bash中很容易做到!只需对primes.txt文件进行cat读取,检查每个数字,检查数字是否小于2^32,如果小于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]
new_primes=open('primes2.txt','a')
n=2**32
[new_primes.write(p)for p in open('primes.txt','r'),如果int(p)
这在Bash中很容易做到!只需对primes.txt文件进行cat读取,检查每个数字,检查数字是否小于2^32,如果小于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]
new_primes=open('primes2.txt','a')
n=2**32
[new_primes.write(p)for p in open('primes.txt','r'),如果int(p)
$perl-lne'打印;如果$2**32'myprimes2.txt,则为最后一个
提供素数的输入序列,最多一个素数超过2**32,然后停止。不将源文件读入内存。

$perl-lne'打印;如果$2**32'myprimes2.txt,则为最后一个
new_primes = open('primes2.txt', 'a')
n = 2**32

[new_primes.write(p) for p in open('primes.txt', 'r') if int(p) < n]

提供素数的输入序列,最多一个素数超过2**32,然后停止。不将源文件读入内存。

在shell中,不将整个13亿数字加载到内存中,您可以使用:

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

[new_primes.write(p) for p in open('primes.txt', 'r') if int(p) < n]
n=4294967296
last=0
while read number
do
    if [ $last -gt $n ]
    then break
    fi
    echo $number
    last=$number
done < primes.txt > primes2.txt

在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

必须在bash中完成吗?我想不必。如果你这么说的话,我在Python方面没有经验,所以它需要复制/粘贴。输入文件名为“primes.txt”。输出到一个名为“primes2.txt”的文件就可以了。对于bash中存在的问题,请参阅Unix StackExchange上的以下内容:是否必须在bash中完成?我想不是。如果你这么说的话,我在Python方面没有经验,所以它需要复制/粘贴。输入文件名为“primes.txt”。输出到一个名为“primes2.txt”的文件就可以了。对于bash中的问题,请在Unix StackExchange上查看:这使用了我所有的RAM,我有16GB的内存。我很高兴我给了自己6GB的交换空间,否则我会崩溃。@CharlesBoyd为什么建议用Perl做这个?更重要的是,为什么要将所有的素数放入一个数组中,而不是仅仅将它们附加到primes2.txt中?这可能会将用于将素数添加到primes2.txt所需的RAM量增加一倍。最后,忧郁先生说他想要2^32以下的素数。而是检查素数是否不大于2^32。因此,等于2^32的素数将附加到代码中,而它们不应符合问题中的规范。这是一个小错误,但值得一提。@Maxwell,我认为用Perl做会更干净(尽管实际上bash做得很好)——我把它存储在一个数组中,因为我在清楚他想用它做什么(将它全部打印到primes2.txt)之前编写了代码片段(作为概念证明),这使用了我所有的RAM,我有16GB。我很高兴我给了自己6GB的交换空间,否则我会崩溃。@CharlesBoyd为什么建议用Perl做这个?更重要的是,为什么要将所有的素数放入一个数组中,而不是仅仅将它们附加到primes2.txt中?这可能会将用于将素数添加到primes2.txt所需的RAM量增加一倍。最后,忧郁先生说他想要2^32以下的素数。相反,你检查质数