පූර්ණ සංඛ්‍යා එකතු කිරීමට ෂෙල් විධානය, එක් පේළියකට එකක්?


884

මම සොයන්නේ (ආදාන ලෙස) පෙළ පෙළක්, එක් එක් පේළිය තනි නිඛිලයක් අඩංගු වන අතර මෙම නිඛිලවල එකතුව ප්‍රතිදානය කරන විධානයකි.

ටිකක් පසුබිමක් ලෙස, මට කාල මිනුම් ඇතුළත් ලොග් ගොනුවක් ඇත. අදාළ රේඛා සඳහා ග්‍රහණය කර ගැනීම සහ නැවත ආකෘතිකරණය කිරීම තුළින් sedමට එම ගොනුවේ ඇති සියලුම වේලාවන් ලැයිස්තුගත කළ හැකිය. මම සම්පූර්ණ වැඩ කිරීමට කැමතියි. අවසාන මුදල සිදු කිරීම සඳහා මට මෙම අතරමැදි ප්‍රතිදානය ඕනෑම විධානයකට නල කළ හැකිය. මම සෑම විටම exprඅතීතයේ භාවිතා කර ඇත, නමුත් එය ආර්පීඑන් මාදිලියේ ධාවනය නොවන්නේ නම් එය මේ සමඟ සාර්ථකව කටයුතු කරනු ඇතැයි මම නොසිතමි (එවිට පවා එය ව්‍යාකූල වනු ඇත).

පූර්ණ සංඛ්‍යා වල සාරාංශය ලබා ගන්නේ කෙසේද?


2
මෙය මා මීට කලකට පෙර ඇසූ ප්‍රශ්නයකට බොහෝ සෙයින් සමාන ය: stackoverflow.com/questions/295781/…
An̲̳̳drew

5
හැකි නිවැරදි (හෝ අවම වශයෙන් වැඩ කරන) පිළිතුරු රාශියක් තිබීම නිසා මම මෙම ප්‍රශ්නයට ඇත්තෙන්ම කැමතියි.
ෆ්‍රැන්සිස්කෝ කැනෙඩෝ

මෙම ප්‍රශ්නය කේත ගොල්ෆ් ක්‍රීඩාවට ගැටලුවක් සේ හැඟේ. codegolf.stackexchange.com :)
ගෝර්ඩන් බීන්

Answers:


1359

බිට් අවුල් එය කළ යුතුද?

awk '{s+=$1} END {print s}' mydatafile

සටහන: ඔබ 2 ^ 31 (2147483647) ඉක්මවන කිසිවක් එකතු කිරීමට යන්නේ නම්, සමහර අවුල් අනුවාද වල අමුතු හැසිරීම් ඇත. වැඩි පසුබිමක් සඳහා අදහස් බලන්න. එක් යෝජනාවක් භාවිතා කිරීමයි printfවඩා print:

awk '{s+=$1} END {printf "%.0f", s}' mydatafile

9
මේ කාමරයේ අමුතු ආදරයක් තියෙනවා! $ 1 ට $ 2 ට වෙනස් කිරීමෙන් දෙවන දත්ත තීරුවක් එකතු කිරීම සඳහා මෙවැනි සරල පිටපතක් වෙනස් කළ හැකි ආකාරය මම කැමතියි
පෝල් ඩික්සන්

2
ප්‍රායෝගික සීමාවක් නොමැත, මන්ද එය ආදානය ප්‍රවාහයක් ලෙස සකසනු ඇත. එබැවින්, එය X රේඛා ගොනුවක් හැසිරවිය හැකි නම්, ඔබට X + 1 හැසිරවිය හැකි බව ඔබට විශ්වාසයි.
පෝල් ඩික්සන්

4
මම වරක් නිවාඩු උපයෝගීතාව හරහා ධාවනය වන අමුතු පිටපතක් සහිත මුලික තැපැල් ලැයිස්තු සකසනයක් ලිවීය. හොඳ කාලයන්. :)
LS

2
මෙය සඳහා භාවිතා කර ඇත්තේ: සියලුම ලේඛනවල පිටු පිටපත ගණන් කරන්න:ls $@ | xargs -i pdftk {} dump_data | grep NumberOfPages | awk '{s+=$2} END {print s}'
පියාඹන බැටළුවන්

8
ප්‍රවේශම් වන්න, එය 2147483647 (එනම් 2 ^ 31) ට වඩා වැඩි සංඛ්‍යාවක් සමඟ ක්‍රියා නොකරනු ඇත, එයට හේතුව awk විසින් බිට් 32 අත්සන් කළ පූර්ණ සංඛ්‍යා නිරූපණයක් භාවිතා කරන බැවිනි. awk '{s+=$1} END {printf "%.0f", s}' mydatafileඒ වෙනුවට භාවිතා කරන්න .
ජියැන්කාර්ලෝ ස්පෝර්ටෙලි

673

පේස්ට් සාමාන්‍යයෙන් බහු ලිපිගොනු පේළි ඒකාබද්ධ කරයි, නමුත් ගොනුවක තනි පේළි තනි පේළියක් බවට පරිවර්තනය කිරීමටද එය භාවිතා කළ හැකිය. පරිසීමක ධජය මඟින් ඔබට x + x වර්ගයේ සමීකරණයක් bc වෙත යැවීමට ඉඩ ලබා දේ.

paste -s -d+ infile | bc

විකල්පයක් ලෙස, ස්ටැඩින් සිට නල මාර්ගයේ,

<commands> | paste -s -d+ - | bc

1
ඉතා කදිමයි! මම "+" ට පෙර ඉඩක් තැබුවෙමි, එය වඩා හොඳින් විග්‍රහ කිරීමට මට උදව් වනු ඇත, නමුත් එය පේස්ට් සහ පසුව බීසී හරහා මතක අංක කිහිපයක් නල කිරීම සඳහා ඉතා පහසු විය.
මයිකල් එච්.

75
අවදි විසඳුමට වඩා මතක තබා ගැනීමට සහ ටයිප් කිරීමට පහසුය. ලිපිගොනුවක් ලෙස pasteඉරක් භාවිතා කළ හැකි බව සලකන්න -- එමඟින් පළමු ගොනුවක් සෑදීමකින් තොරව විධානයක ප්‍රතිදානයේ සිට පේස්ට් වල සම්මත නිමැවුමට අංකනය කිරීමට ඔබට ඉඩ සලසයි:<commands> | paste -sd+ - | bc
ජෝර්ජ්

20
මගේ ළඟ මිලියන 100 ක ලිපිගොනුවක් තිබෙනවා. Awk විධානය 21s ගනී; paste විධානය 41s ගනී. කෙසේ වෙතත් 'පේස්ට්' හමුවීම සතුටක්!
අභි

5
Bi අභි: සිත්ගන්නාසුළුයි: DI අනුමාන කරන්නේ අමුතු විධානය සොයා ගැනීමට මට 20 ක් ගතවනු ඇති බැවින් මා මිලියන 100 ක් සහ එක් අංකයක් උත්සාහ කරන තෙක් එය සමනය වන බවයි: D
Mark K Cowan

6
E ජෝර්ජ් ඔබට එය අත්හැරිය හැකිය -. (ඔබට ගොනුවක් stdin සමඟ ඒකාබද්ධ කිරීමට අවශ්‍ය නම් එය ප්‍රයෝජනවත් වේ ).
ඇලෝයිස් මහඩාල්

130

පයිතන් හි එක්-ලයිනර් අනුවාදය:

$ python -c "import sys; print(sum(int(l) for l in sys.stdin))"

එක් ලයිනර්ට ඉහළින් sys.argv හි ගොනු සඳහා ක්‍රියා නොකරයි, නමුත් එය කරන්නේ stackoverflow.com/questions/450799/…
jfs

ඇත්ත- කතුවරයා කියා සිටියේ ඔහු වෙනත් ස්ක්‍රිප්ට් එකකින් ප්‍රතිදානය විධානයට නල කිරීමට යන බවත් මම එය හැකි තරම් කෙටි කිරීමට උත්සාහ කරන
බවත්ය

40
කෙටි අනුවාදය වනු ඇතpython -c"import sys; print(sum(map(int, sys.stdin)))"
jfs

4
කියවීමේ පහසුව සහ නම්‍යශීලිත්වය සඳහා මම මෙම පිළිතුරට කැමතියි. නාමාවලි එකතුවක මට සාමාන්‍යයෙන් 10Mb ට වඩා අඩු ලිපිගොනු ප්‍රමාණයක් අවශ්‍ය වූ අතර එය මේ ආකාරයට වෙනස් කරන ලදි:find . -name '*.epub' -exec stat -c %s '{}' \; | python -c "import sys; nums = [int(n) for n in sys.stdin if int(n) < 10000000]; print(sum(nums)/len(nums))"
පෝල් විප්

1
ඔබට යම් පෙළක් මිශ්‍ර වී ඇත්නම් අංක නොවන අංක පෙරහන් කළ හැකිය:import sys; print(sum(int(''.join(c for c in l if c.isdigit())) for l in sys.stdin))
ග්‍රැනිටෝසෝරස්

96

පොදුවේ අනුමත කරන ලද විසඳුම පිළිබඳව මම විශාල අනතුරු ඇඟවීමක් කරමි:

awk '{s+=$1} END {print s}' mydatafile # DO NOT USE THIS!!

එයට හේතුව මෙම ස්වරූපයෙන් awk බිට් 32 අත්සන් කළ පූර්ණ සංඛ්‍යා නිරූපණයක් භාවිතා කරයි: එය 2147483647 (එනම් 2 ^ 31) ඉක්මවන මුදල් සඳහා පිරී ඉතිරී යනු ඇත.

වඩාත් පොදු පිළිතුරක් (පූර්ණ සංඛ්‍යා සාරාංශ කිරීම සඳහා) වනුයේ:

awk '{s+=$1} END {printf "%.0f\n", s}' mydatafile # USE THIS INSTEAD

Printf () මෙහි උදව් කරන්නේ ඇයි? සාරාංශ කේතය එක හා සමාන බැවින් int හි පිටාර ගැලීම ඊට පෙර සිදුවනු ඇත.
රොබට් ක්ලෙම්

10
ගැටලුව ඇත්ත වශයෙන්ම "මුද්‍රණ" ශ්‍රිතයේ පවතින බැවිනි. අව්ක් බිට් 64 නිඛිල සංඛ්‍යාවක් භාවිතා කරයි, නමුත් කිසියම් හේතුවක් නිසා මුද්‍රණය ඒවා බිට් 32 දක්වා අඩු කරයි.
ජියැන්කාර්ලෝ ස්පෝර්ටෙලි

4
මුද්‍රණ දෝෂය අවම වශයෙන් 4.0.1 සහ bash 4.3.11 සඳහා නිවැරදි කර ඇති බව පෙනේ, මා වරදවා වටහා නොගත්තොත්: echo -e "2147483647 \n 100" |awk '{s+=$1}END{print s}'පෙන්වයි2147483747
Xen2050

4
පාවෙන භාවිතා කිරීම නව ගැටළුවක් හඳුන්වා දෙයි: echo 999999999999999999 | awk '{s+=$1} END {printf "%.0f\n", s}'නිෂ්පාදනය කරයි1000000000000000000
පැට්‍රික්

1
64bit පද්ධතිවල "% ld" භාවිතා කිරීමෙන් 32bit ට printf කප්පාදු නොකිරීමට ක්‍රියා කළ යුතු නොවේද? At පැට්‍රික් පෙන්වා දෙන පරිදි, පාවෙන මෙහි හොඳ අදහසක් නොවේ.
yerforkferchips

79

සරල බැෂ්:

$ cat numbers.txt 
1
2
3
4
5
6
7
8
9
10
$ sum=0; while read num; do ((sum += num)); done < numbers.txt; echo $sum
55

2
වඩා කුඩා එකක් නෞකාවකි: stackoverflow.com/questions/450799/...
Khaja Minhajuddin

jjjack, කොහෙද numඅර්ථ දක්වන්නේ? කෙසේ හෝ එය < numbers.txtප්‍රකාශනයට සම්බන්ධ වී ඇති බව මම විශ්වාස කරමි , නමුත් එය කෙසේ දැයි පැහැදිලි නැත.
ඇට්කොල්ඩ්

67
dc -f infile -e '[+z1<r]srz1<rp'

Us ණ ලකුණ සමඟ උපසර්ගය negative ණ සංඛ්‍යා සඳහා පරිවර්තනය කළ යුතු බව සලකන්න dc, මන්ද එය ඒ සඳහා _උපසර්ගයට වඩා -උපසර්ගය භාවිතා කරයි. උදාහරණයක් ලෙස, හරහා tr '-' '_' | dc -f- -e '...'.

සංස්කරණය කරන්න: මෙම පිළිතුරට “අපැහැදිලි භාවය” සඳහා බොහෝ ඡන්ද ලැබී ඇති හෙයින්, සවිස්තරාත්මක පැහැදිලි කිරීමක් මෙන්න:

ප්‍රකාශනය [+z1<r]srz1<rp පහත සඳහන් දේ කරයි :

[   interpret everything to the next ] as a string
  +   push two values off the stack, add them and push the result
  z   push the current stack depth
  1   push one
  <r  pop two values and execute register r if the original top-of-stack (1)
      is smaller
]   end of the string, will push the whole thing to the stack
sr  pop a value (the string above) and store it in register r
z   push the current stack depth again
1   push 1
<r  pop two values and execute register r if the original top-of-stack (1)
    is smaller
p   print the current top-of-stack

ව්‍යාජ කේතයක් ලෙස:

  1. "Add_top_of_stack" ලෙස අර්ථ දක්වන්න:
    1. ඉහළ අගයන් දෙක තොගයෙන් ඉවත් කර ප්‍රති result ලය නැවත එක් කරන්න
    2. තොගයේ අගයන් දෙකක් හෝ වැඩි ගණනක් තිබේ නම්, "add_top_of_stack" පුනරාවර්තනය කරන්න
  2. තොගයේ අගයන් දෙකක් හෝ වැඩි ගණනක් තිබේ නම්, "add_top_of_stack" ධාවනය කරන්න
  3. ප්‍රති result ලය මුද්‍රණය කරන්න, දැන් තොගයේ ඉතිරිව ඇති එකම අයිතමය

dcමෙහි ඇති සරල බව සහ බලය සැබවින්ම වටහා ගැනීම සඳහා dc, ඉහත විධානයෙහි පයිතන් අනුවාදයෙන් සමහර විධානයන් ක්‍රියාත්මක කරන සහ ක්‍රියාත්මක කරන ක්‍රියාකාරී පයිතන් පිටපතක් මෙහි ඇත:

### Implement some commands from dc
registers = {'r': None}
stack = []
def add():
    stack.append(stack.pop() + stack.pop())
def z():
    stack.append(len(stack))
def less(reg):
    if stack.pop() < stack.pop():
        registers[reg]()
def store(reg):
    registers[reg] = stack.pop()
def p():
    print stack[-1]

### Python version of the dc command above

# The equivalent to -f: read a file and push every line to the stack
import fileinput
for line in fileinput.input():
    stack.append(int(line.strip()))

def cmd():
    add()
    z()
    stack.append(1)
    less('r')

stack.append(cmd)
store('r')
z()
stack.append(1)
less('r')
p()

2
dc යනු භාවිතා කිරීමට තෝරා ගැනීමේ මෙවලම පමණි. නමුත් මම එය කරන්නේ ටිකක් අඩු ස්ටැක් ඔප් එකකින්. සියලුම රේඛාවල ඇත්ත වශයෙන්ම සංඛ්‍යාවක් අඩංගු යැයි උපකල්පනය කර ඇත : (echo "0"; sed 's/$/ +/' inp; echo 'pq')|dc.
ikrabbe

5
සමඟ අමුත්තන් ඇල්ගොරිතමය: dc -e '0 0 [+?z1<m]dsmxp'. එබැවින් අපි සැකසීමට පෙර සියලු සංඛ්‍යා තොගයේ ඉතිරි නොකරමු, නමුත් ඒවා එකින් එක කියවා සැකසෙමු (වඩාත් නිවැරදිව කිවහොත්, රේඛාව අනුව පේළිය, එක් පේළියක සංඛ්‍යා කිහිපයක් අඩංගු විය හැකි බැවින්). හිස් රේඛාවට ආදාන අනුක්‍රමයක් අවසන් කළ හැකි බව සලකන්න.
ruvim

@ikrabbe ඒක නියමයි. එය ඇත්ත වශයෙන්ම තවත් එක් අක්‍ෂරයකින් කෙටි කළ හැකිය: තර්ක සහ ක්‍රියාකරුවන් අතර ඇති අවකාශයන් ගැන තැකීමක් නොකරන පරිදි ආදේශනයේ ඇති ඉඩ sedඉවත් කළ හැකිය dc. (echo "0"; sed 's/$/+/' inputFile; echo 'pq')|dc
WhiteHotLoveTiger

58

Jq සමඟ :

seq 10 | jq -s 'add' # 'add' is equivalent to 'reduce .[] as $item (0; . + $item)'

7
මම මෙයට කැමතියි එය ඉතා පැහැදිලිව හා කෙටි බැවින් එය මතක තබා ගැනීමට මට හැකි වනු ඇත.
ඇල්ෆ්

46

පිරිසිදු හා කෙටි බෑෂ්.

f=$(cat numbers.txt)
echo $(( ${f//$'\n'/+} ))

9
මෙය හොඳම විසඳුම වන්නේ ඔබ පළමු පේළිය ආදේශ කළහොත් එය කිසිදු උප ක්‍රියාවලියක් නිර්මාණය නොකරන බැවිනි f=$(<numbers.txt).
loentar

1
stdin වෙතින් ආදානය ලබා ගත හැකි ක්‍රමයක් තිබේද? පයිප්පයකින් වගේද?
njzk2

a njzk2 ඔබ ස්ක්‍රිප්ටයක් දැමුවහොත්, ඔබට f=$(cat); echo $(( ${f//$'\n'/+} ))එම ස්ක්‍රිප්ටයට ඕනෑම දෙයක් පයිප්ප කිරීමට හෝ අන්තර්ක්‍රියාකාරී ස්ටැඩින් ආදානය සඳහා තර්ක නොමැතිව එය ආයාචනා කළ හැකිය (පාලන-ඩී සමඟ අවසන් කරන්න).
mklement0

5
entloentar <numbers.txtමෙය වැඩිදියුණු කිරීමකි, නමුත් සමස්තයක් ලෙස මෙම විසඳුම කාර්යක්ෂම වන්නේ කුඩා ආදාන ගොනු සඳහා පමණි; උදාහරණයක් ලෙස, ආදාන රේඛා 1,000 කින් යුත් ගොනුවක් සමඟ පිළිගත් awkවිසඳුම මගේ යන්ත්‍රයේ 20 ගුණයක් වේගවත් වේ - එසේම අඩු මතකයක් පරිභෝජනය කරයි, මන්ද ගොනුව එකවර කියවන්නේ නැති බැවිනි.
mklement0

2
මම මේ වෙත ළඟා වන විට මට බලාපොරොත්තු සුන් වී තිබුණි. පිරිසිදු බාෂ්!
ඔමර් අක්තර්

37
perl -lne '$x += $_; END { print $x; }' < infile.txt

4
මම ඒවා නැවත එකතු කළෙමි: "-l" මඟින් ප්‍රතිදානය එල්එෆ්-ෂෙල් බැක්ටික්ස් ලෙස අවසන් වන බව සහතික කරන අතර බොහෝ වැඩසටහන් අපේක්ෂා කරන අතර "<" මඟින් පෙන්නුම් කරන්නේ මෙම විධානය නල මාර්ගයක භාවිතා කළ හැකි බවයි.
j_random_hacker

ඔයා හරි. නිදහසට කරුණක් ලෙස: පර්ල් එක්-ලයිනර් හි සෑම චරිතයක් සඳහාම මට මානසික වැඩක් අවශ්‍ය වේ, එබැවින් හැකි තරම් චරිත ඉවත් කිරීමට මම කැමැත්තෙමි. මෙම නඩුවේ පුරුද්ද හානිකර විය.
jfs

2
සෑම දෙයක්ම RAM වෙත පටවන්නේ නැති විසඳුම් කිහිපයෙන් එකක්.
එරික් ඇරොනෙස්ටි

29

මගේ ශත පහළොව:

$ cat file.txt | xargs  | sed -e 's/\ /+/g' | bc

උදාහරණයක්:

$ cat text
1
2
3
3
4
5
6
78
9
0
1
2
3
4
576
7
4444
$ cat text | xargs  | sed -e 's/\ /+/g' | bc 
5148

මගේ ආදානයේ හිස් රේඛා අඩංගු විය හැකි බැවින් ඔබ මෙහි පළ කළ දේ සහ අ grep -v '^$'. ස්තූතියි!
ජේම්ස් ඔරවෙක්

වොව්!! ඔබේ පිළිතුර පුදුම සහගතයි!
පාගමනින්

මේ සඳහා ආදරය කරන්න සහ නල මාර්ග සඳහා +1 කරන්න. මට ඉතා සරල හා පහසු විසඳුමක්
Gelin Luo

24

පවත්නා පිළිතුරු සඳහා මම ඉක්මන් මිණුම් ලකුණක් කර ඇත්තෙමි

  • සම්මත මෙවලම් පමණක් භාවිතා කරන්න ( luaහෝ වැනි දේ ගැන කණගාටුයි rocket),
  • සැබෑ එක්-ලයිනර් වේ,
  • විශාල සංඛ්‍යාවක් (මිලියන 100) එකතු කිරීමේ හැකියාව ඇත, සහ
  • වේගවත් (විනාඩියකට වඩා වැඩි කාලයක් ගත වූ ඒවා මම නොසලකා හැරියෙමි).

මම සෑම විටම විසඳුම් කිහිපයක් සඳහා විනාඩියකටත් අඩු කාලයකින් මගේ යන්ත්‍රයේ කළ හැකි මිලියන 1 සිට 100 දක්වා සංඛ්‍යා එකතු කළෙමි.

ප්‍රති results ල මෙන්න:

පයිතන්

:; seq 100000000 | python -c 'import sys; print sum(map(int, sys.stdin))'
5000000050000000
# 30s
:; seq 100000000 | python -c 'import sys; print sum(int(s) for s in sys.stdin)'
5000000050000000
# 38s
:; seq 100000000 | python3 -c 'import sys; print(sum(int(s) for s in sys.stdin))'
5000000050000000
# 27s
:; seq 100000000 | python3 -c 'import sys; print(sum(map(int, sys.stdin)))'
5000000050000000
# 22s
:; seq 100000000 | pypy -c 'import sys; print(sum(map(int, sys.stdin)))'
5000000050000000
# 11s
:; seq 100000000 | pypy -c 'import sys; print(sum(int(s) for s in sys.stdin))'
5000000050000000
# 11s

අවුල්

:; seq 100000000 | awk '{s+=$1} END {print s}'
5000000050000000
# 22s

අලවන්න සහ බීසී

මෙය මගේ යන්ත්‍රයේ මතකය නැති වී ගියේය. එය ආදානයේ ප්‍රමාණයෙන් අඩක් (අංක මිලියන 50) වැඩ කළේය:

:; seq 50000000 | paste -s -d+ - | bc
1250000025000000
# 17s
:; seq 50000001 100000000 | paste -s -d+ - | bc
3750000025000000
# 18s

ඒ නිසා මම හිතන්නේ එය මිලියන 100 සඳහා ඩොලර් 35 ක් ගතවනු ඇත.

පර්ල්

:; seq 100000000 | perl -lne '$x += $_; END { print $x; }'
5000000050000000
# 15s
:; seq 100000000 | perl -e 'map {$x += $_} <> and print $x'
5000000050000000
# 48s

රූබි

:; seq 100000000 | ruby -e "puts ARGF.map(&:to_i).inject(&:+)"
5000000050000000
# 30s

සී

සංසන්දනය කිරීම සඳහා මම සී අනුවාදය සම්පාදනය කර මෙයද පරීක්‍ෂා කළෙමි, මෙවලම් මත පදනම් වූ විසඳුම් කෙතරම් මන්දගාමීද යන්න පිළිබඳ අදහසක් ලබා ගැනීම සඳහා.

#include <stdio.h>
int main(int argc, char** argv) {
    long sum = 0;
    long i = 0;
    while(scanf("%ld", &i) == 1) {
        sum = sum + i;
    }
    printf("%ld\n", sum);
    return 0;
}

 

:; seq 100000000 | ./a.out 
5000000050000000
# 8s

නිගමනය

C ඇත්ත වශයෙන්ම 8s සමඟ වේගවත් වේ, නමුත් Pypy විසඳුම එකතු කරන්නේ 30% සිට 11s දක්වා ඉතා සුළු පිරිවැයක් පමණි . එහෙත්, සාධාරණ ලෙස කිවහොත්, පයිපී හරියටම සම්මත නොවේ. බොහෝ අය CPython ස්ථාපනය කර ඇති අතර එය සැලකිය යුතු ලෙස මන්දගාමී (22s), ජනප්‍රිය අව්ක් විසඳුම තරම් වේගවත් ය.

සම්මත මෙවලම් මත පදනම් වූ වේගවත්ම විසඳුම වන්නේ පර්ල් (15s) ය.


2
මෙම paste+ bcප්රවේශය මම මුදලක් hex වටිනාකම් හෙව්වා දේ, ස්තූතියි විය!
ටොමිස්ලාව් නාකික්-ඇල්ෆිරෙවික්

1
විනෝදය සඳහා, රස්ට් හි:use std::io::{self, BufRead}; fn main() { let stdin = io::stdin(); let mut sum: i64 = 0; for line in stdin.lock().lines() { sum += line.unwrap().parse::<i64>().unwrap(); } println!("{}", sum); }
ජොසලින්

නියම පිළිතුර. නිට්පික් කිරීමට නොව, දිගු කාලීන ප්‍රති results ල ඇතුළත් කිරීමට ඔබ තීරණය කළහොත්, පිළිතුර ඊටත් වඩා නියමයි!
ස්ටීවන් ලූ

Te ස්ටීවන්ලු මට හැඟුණේ පිළිතුර තව දුරටත් දිගු වන අතර එමඟින් නියමයි (ඔබේ වචන භාවිතා කිරීමට). නමුත් මෙම හැඟීම සෑම කෙනෙකුටම බෙදා ගත යුතු නැති බව මට තේරුම් ගත හැකිය :)
Alfe

ඊළඟට: අංකබා + සමාන්තරකරණය
ගෙරිට්

18

BASH විසඳුම, ඔබට මෙය විධානයක් කිරීමට අවශ්‍ය නම් (උදා: ඔබට මෙය නිතර කිරීමට අවශ්‍ය නම්):

addnums () {
  local total=0
  while read val; do
    (( total += val ))
  done
  echo $total
}

ඉන්පසු භාවිතය:

addnums < /tmp/nums


14

මම හිතන්නේ AWK යනු ඔබ සොයන දෙයයි:

awk '{sum+=$1}END{print sum}'

සම්මත ආදානය හරහා අංක ලැයිස්තුව සම්මත කිරීමෙන් හෝ පරාමිතියක් ලෙස සංඛ්‍යා අඩංගු ගොනුව සම්මත කිරීමෙන් ඔබට මෙම විධානය භාවිතා කළ හැකිය.



11

පහත දැක්වෙන්නේ කඩිනමින් ය:

I=0

for N in `cat numbers.txt`
do
    I=`expr $I + $N`
done

echo $I

1
ලිපිගොනු අත්තනෝමතික ලෙස විශාල විය හැකි විට විධාන ප්‍රසාරණය ප්‍රවේශමෙන් භාවිතා කළ යුතුය. 10MB හි numbers.txt සමඟ, cat numbers.txtපියවර ගැටළු සහගත වනු ඇත.
ජියාකොමෝ

1
ඇත්ත වශයෙන්ම, කෙසේ වෙතත් (මෙහි ඇති වඩා හොඳ විසඳුම් සඳහා නොවේ නම්) මම ඇත්ත වශයෙන්ම එම ගැටලුවට මුහුණ දෙන තෙක් මෙය භාවිතා කරමි.
ෆ්‍රැන්සිස්කෝ කැනෙඩෝ

11

ඔබට අවශ්‍ය දේ සඳහා අධික ලෙස මරා දැමිය හැකි වුවද, ඔබට සංඛ්‍යා-භාවිතයන් භාවිතා කළ හැකිය. මෙය කවචයේ සංඛ්‍යා හැසිරවීම සඳහා වූ වැඩසටහන් සමූහයක් වන අතර ඇත්ත වශයෙන්ම ඒවා එකතු කිරීම ඇතුළුව නව දේවල් කිහිපයක් කළ හැකිය. එය යල්පැන ඇති නමුත් ඒවා තවමත් ක්‍රියාත්මක වන අතර ඔබට තවත් යමක් කිරීමට අවශ්‍ය නම් එය ප්‍රයෝජනවත් වේ.

http://suso.suso.org/programs/num-utils/


උදාහරණය : numsum numbers.txt.
agc

9

මෙය පැරණි ප්‍රශ්නයක් බව මට වැටහී ඇත, නමුත් මෙම විසඳුම බෙදා ගැනීමට තරම් මම කැමතියි.

% cat > numbers.txt
1 
2 
3 
4 
5
^D
% cat numbers.txt | perl -lpe '$c+=$_}{$_=$c'
15

උනන්දුවක් තිබේ නම්, එය ක්‍රියාත්මක වන ආකාරය මම පැහැදිලි කරමි.


10
කරුණාකරලා එපා. -N සහ -p හොඳ අර්ථකථන දේවල් යැයි මවා
පෑමට

2
ඔව් කරුණාකරලා පැහැදිලි කරන්න :) (මම පර්ල් වර්ගයේ පුද්ගලයෙක් නොවේ.)
ජෙන්ස්

2
"Perl -MO = Deparse -lpe '$ c + = $ _} {_ _ = $ c' ධාවනය කර උත්සාහ කරන්න, ප්‍රතිදානය දෙස බලන්න, මූලික වශයෙන් -l නව රේඛා සහ ආදාන සහ ප්‍රතිදාන බෙදුම්කරුවන් භාවිතා කරයි, සහ -p සෑම පේළියක්ම මුද්‍රණය කරයි. නමුත් '-p' කිරීම සඳහා, පර්ල් මුලින්ම බොයිලේරු තහඩුවක් එක් කරයි (කුමන -MO = ඩිපාර්ස්) ඔබට පෙන්වනු ඇත, නමුත් පසුව එය ආදේශ කර සම්පාදනය කරයි. මේ අනුව ඔබට '} {' කොටස සමඟ අමතර වාරණයක් ඇතුළත් කළ හැකි අතර එය එක් එක් පේළියේ මුද්‍රණය නොකිරීමට උත්සාහ කරන්න, නමුත් අවසානයේ මුද්‍රණය කරන්න.
නිම්

9

පිරිසිදු බෑෂ් සහ එක් ලයිනර් එකක :-)

$ cat numbers.txt
1
2
3
4
5
6
7
8
9
10


$ I=0; for N in $(cat numbers.txt); do I=$(($I + $N)); done; echo $I
55

((වරහන් දෙකක් ඇත්තේ ))ඇයි?
ඇට්කොල්ඩ්

බළලා නිසා ඇත්තෙන්ම පිරිසිදු බාෂ් නොවේ. බළලුන් වෙනුවට ආදේශ කිරීමෙන් එය පිරිසිදු කරන්න$(< numbers.txt)
Dani_l


7

GNU datamash උපයෝගීතාව භාවිතා කිරීම :

seq 10 | datamash sum 1

ප්‍රතිදානය:

55

ආදාන දත්ත අක්‍රමවත් නම්, අවකාශයන් සහ ටැබ් අමුතු ස්ථානවල තිබේ නම්, මෙය ව්‍යාකූල විය හැකිය datamash, පසුව එක්කෝ -Wස්විචය භාවිතා කරන්න :

<commands...> | datamash -W sum 1

... හෝ trහිස් අවකාශය පිරිසිදු කිරීමට භාවිතා කරන්න:

<commands...> | tr -d '[[:blank:]]' | datamash sum 1

7

මෙය ඉදිරිපත් කිරීමෙන් වැළකී සිටිය නොහැක:

jot 1000000 | sed '2,$s/$/+/;$s/$/p/' | dc

එය මෙතැනින් හමු වේ:
අත්තනෝමතික නිරවද්‍යතාවයේ සංඛ්‍යා ලැයිස්තුවක් එකතු කිරීම සඳහා වඩාත් අලංකාර යුනික්ස් ෂෙල් වන්-ලයිනර්?

අමුතු, බීසී සහ මිතුරන්ට වඩා එහි විශේෂ වාසි මෙන්න:

  • එය බෆරින් මත රඳා නොපවතින අතර එමඟින් විශාල යෙදවුම් සමඟ යටපත් නොවේ
  • එමගින් සීමාවන් සඳහා නිශ්චිත නිරවද්‍යතාවයක් හෝ පූර්ණ සංඛ්‍යා ප්‍රමාණයක් අදහස් නොකෙරේ (හෙලෝ AWK!)
  • පාවෙන ලක්ෂ්‍ය අංක එකතු කිරීමට අවශ්‍ය නම් විවිධ කේත අවශ්‍ය නොවේ

කරුණාකර ප්‍රශ්නයට අදාළ කේතය පිළිතුරෙහි ඇතුළත් කර සබැඳියක් වෙත යොමු නොවන්න
ඉබෝ

6

විකල්ප පිරිසිදු පර්ල්, තරමක් කියවිය හැකි, පැකේජ හෝ විකල්ප අවශ්‍ය නොවේ:

perl -e "map {$x += $_} <> and print $x" < infile.txt

හෝ ඉතා කුඩා: perl -e 'සිතියම {$ x + = $ _} <>; $ x 'infile.txt මුද්රණය
Avi Tevet

මිලියන 10 ක විශාල ආදානයක් සඳහා අවශ්‍ය මතකය 2GB පමණ වේ
අමිත් නායිදු

6

රූබි පෙම්වතුන් සඳහා

ruby -e "puts ARGF.map(&:to_i).inject(&:+)" numbers.txt


3

ඔබට සුවපහසුවක් දැනේ නම් ඔබට එය පයිතන් වලින් කළ හැකිය:

පරීක්ෂා කර නැත, ටයිප් කර ඇත:

out = open("filename").read();
lines = out.split('\n')
ints = map(int, lines)
s = sum(ints)
print s

සෙබස්තියන් එක් ලයිනර් පිටපතක් පෙන්වා දුන්නේය:

cat filename | python -c"from fileinput import input; print sum(map(int, input()))"

python -c "fileinput ආදාන ආදානයෙන්; මුද්‍රණ මුදල (සිතියම (int, input ()))"
numbers.txt

2
බළලා වැඩිපුර භාවිතා කර ඇත, ගොනුවෙන් stdin යළි හරවා යවන්න: python -c "..." <numbers.txt
Giacomo

2
jrjack: catස්ක්‍රිප්ට් එක stdin සඳහා මෙන්ම argv [] ( while(<>)පර්ල් හි මෙන් ) සඳහාද ක්‍රියා කරන බව නිරූපණය කිරීමට භාවිතා කරයි . ඔබගේ ආදානය ගොනුවක තිබේ නම් '<' අනවශ්‍යය.
jfs

2
නමුත් < numbers.txtඑය පෙන්නුම් කරන්නේ එය ස්ටැඩින් මත මෙන්ම cat numbers.txt |ක්‍රියා කරන බවයි. එය නරක පුරුදු උගන්වන්නේ නැත.
සියොන් චියාමොව්

3
$ cat n
2
4
2
7
8
9
$ perl -MList::Util -le 'print List::Util::sum(<>)' < n
32

නැතහොත්, විධාන රේඛාවේ අංක ටයිප් කළ හැකිය:

$ perl -MList::Util -le 'print List::Util::sum(<>)'
1
3
5
^D
9

කෙසේ වෙතත්, මෙය විශාල ගොනුවක් භාවිතා කිරීම හොඳ අදහසක් නොවන නිසා ගොනුව ගිලිහී යයි. J_random_hacker ගේ පිළිතුර බලන්න .


3

පහත සඳහන් දෑ ක්‍රියාත්මක විය යුතුය (ඔබේ අංකය එක් එක් පේළියේ දෙවන ක්ෂේත්‍රය යැයි උපකල්පනය කරන්න).

awk 'BEGIN {sum=0} \
 {sum=sum + $2} \
END {print "tot:", sum}' Yourinputfile.txt

2
ඔබට ඇත්ත වශයෙන්ම {sum = 0} කොටස අවශ්‍ය නොවේ
Uphill_ What '1

3

රාකට්හි එක් ලයිනර්:

racket -e '(define (g) (define i (read)) (if (eof-object? i) empty (cons i (g)))) (foldr + 0 (g))' < numlist.txt

3

සී (සරල කර නැත)

seq 1 10 | tcc -run <(cat << EOF
#include <stdio.h>
int main(int argc, char** argv) {
    int sum = 0;
    int i = 0;
    while(scanf("%d", &i) == 1) {
        sum = sum + i;
    }
    printf("%d\n", sum);
    return 0;
}
EOF)

මට අදහස් දැක්වීම ඉහළ නැංවීමට සිදු විය. පිළිතුරේ කිසිදු වරදක් නැත - එය තරමක් හොඳයි. කෙසේ වෙතත්, අදහස් දැක්වීම පිළිතුර නියමයි කියා පෙන්වීමට, මම අදහස් දැක්වීම ඉහළට ඔසවා තබමි.
bballdave025

3

බැක්ටික්ස් ("` ") කියවීමේ හැකියාව සඳහා කල්තියාම සමාව ඉල්ලන්න, නමුත් මේවා බාෂ් හැර වෙනත් ෂෙල් වෙඩි වලින් ක්‍රියා කරන අතර ඒවා වඩාත් පේස්ට් කළ හැකිය. ඔබ එය පිළිගන්නා කවචයක් භාවිතා කරන්නේ නම්, command (විධානය ...) ආකෘතිය `විධානය ... 'ට වඩා කියවිය හැකි (සහ නිදොස් කළ හැකි) වේ. එබැවින් ඔබේ සිහිබුද්ධිය සඳහා වෙනස් කිරීමට නිදහස් වන්න.

මගේ bashrc හි සරල ශ්‍රිතයක් ඇති අතර එය සරල ගණිත අයිතම ගණනාවක් ගණනය කිරීමට awk භාවිතා කරයි

calc(){
  awk 'BEGIN{print '"$@"' }'
}

මෙය +, -, *, /, ^,%, වර්ග, පාපය, කොස්, වරහන් .... (සහ තවත් බොහෝ දේ ඔබේ අනුවාදය අනුව) කරනු ඇත ... ඔබට printf සහ හැඩතල පාවෙන ලක්ෂ්‍යය සමඟ පවා විසිතුරු විය හැකිය. ප්‍රතිදානය, නමුත් මට සාමාන්‍යයෙන් අවශ්‍ය වන්නේ මෙයයි

මෙම විශේෂිත ප්‍රශ්නය සඳහා, මම මෙය එක් එක් පේළිය සඳහා සරලවම කරන්නෙමි:

calc `echo "$@"|tr " " "+"`

එබැවින් සෑම පේළියක්ම එකතු කිරීමට කේත වාරණය මේ වගේ දෙයක් වනු ඇත:

while read LINE || [ "$LINE" ]; do
  calc `echo "$LINE"|tr " " "+"` #you may want to filter out some lines with a case statement here
done

ඔබට අවශ්‍ය වන්නේ ඒවා පේළියකින් පමණක් එකතු කිරීමයි. කෙසේ වෙතත් දත්ත ගොනුවේ ඇති සෑම සංඛ්‍යාවක් සඳහාම

VARS=`<datafile`
calc `echo ${VARS// /+}`

btw මට ඩෙස්ක්ටොප් එකෙන් ඉක්මනින් යමක් කිරීමට අවශ්‍ය නම්, මම මෙය භාවිතා කරමි:

xcalc() { 
  A=`calc "$@"`
  A=`Xdialog --stdout --inputbox "Simple calculator" 0 0 $A`
  [ $A ] && xcalc $A
}

2
ඔබ භාවිතා කරන්නේ කුමන ආකාරයේ පුරාණ කවචයක්ද $()?
nyuszika7h
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.