计算包含多个 30 位数字的文件中的前 3 个整数,计算每行的前 3 个整数并输出总和

计算包含多个 30 位数字的文件中的前 3 个整数,计算每行的前 3 个整数并输出总和

如何从具有多个 30 位长度整数的大文件中提取前三个整数并输出前三个数字的总和。在 Linux 终端中?

答案1

假设integers您的意思digits是每行的前 3 个字符始终是数字:

awk '{sum+=substr($0,1,3)} END{print sum+0}' file

答案2

perl -Mbigint -MList::Util=sum -lne '
  print sum(0, (/(?<!\d)\d{30}(?!\d)/g)[0..2])' < your-file

将找到前 3 个恰好包含 30 个十进制数字且未被更多数字包围的序列,将它们相加并输出结果。

如果一行中的数字少于 3 个,则对尽可能多的数字进行求和。如果您只想获得至少包含 3 个数字的行的结果,请将其更改为:

perl -Mbigint -MList::Util=sum -lne '
  @numbers = /(?<!\d)\d{30}(?!\d)/g;
  print sum(0, @numbers[0..2]) if @numbers >= 3
  ' < your-file

答案3

使用 Raku(以前称为 Perl_6)

~$ raku -e 'my @a; repeat {get.match(:global, /\d**30/) ??  @a.push(~$/) !! next} until @a.elems == 3; @a.sum.put'   30_digits.txt

输入示例:

~$ raku -e 'for ^3 { put ([0..9].roll xx 30).join};' > 30_digits.txt
~$ cat 30_digits.txt
785624076726806242935676754394
801557051570803235347163971795
620594508808581496037051947969

示例输出:

2207775637106190974319892674158

Raku 中的这个答案将读取前三个 30 位数字,并对它们求和。对于:global“副词”(即参数),30 位数字来自哪一行并不重要。如果没有:global“副词”,Raku 将采用第一的每行遇到 30 位数字,并对三个这样的数字求和。

上面的 Raku 代码仅包含一个“基本”正则表达式,当然,由于正则表达式从左到右读取,长度超过 30 位的数字将在右端被截断。当然,您可以通过包含(右侧)字段分隔符(例如 CSV 文件中的逗号)来改进匹配。如果您遇到识别问题,可以尝试的通用正则表达式可能是:

/ \D? \d**30 \D /

https://docs.raku.org/language/regexes
https://raku.org

相关内容