如何从具有多个 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 /