複数の30ビット長整数を含む大容量ファイルから最初の3つの整数を抽出し、最初の3つの数字の合計を出力する方法。 Linux端末で?
答え1
各行の最初の3文字は常に数字であるとしますintegers
。digits
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
正確に30個の10進数を含み、もはや数字で囲まれていない最初の3つのシーケンスを見つけて追加し、結果を出力します。
連続した数字が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
楽がとります最初各行は30桁の数字に会い、そのような3つの数字を合計します。
上記のRakuコードには「基本」正規表現のみが含まれています。もちろん、正規表現は左から右に読み取られるため、30桁より長い数字は右端で切り捨てられます。もちろん、(右側の)フィールド区切り文字(CSVファイルのコンマなど)を含む一致を改善することもできます。認識に問題がある場合に試すことができる一般的な正規表現は次のとおりです。
/ \D? \d**30 \D /