Bash-opdracht om een ​​kolom met getallen op te tellen

Ik wil een bash-commando dat ik kan pijpen om een ​​kolom met getallen op te tellen. Ik wil gewoon een snelle oneliner die in wezen zoiets als dit zal doen:

cat FileWithColumnOfNumbers.txt | sum

Antwoord 1, autoriteit 100%

Bestaand bestand gebruiken:

paste -sd+ infile | bc

Stdin gebruiken:

<cmd> | paste -sd+ | bc

Bewerken:
Bij sommige plakimplementaties moet je explicieter zijn bij het lezen van stdin:

<cmd> | paste -sd+ - | bc

Gebruikte opties:

-s (serieel) – voegt alle regels samen tot een enkele regel

-d – gebruik een niet-standaard scheidingsteken (in dit geval het teken +)


Antwoord 2, autoriteit 22%

Ik vind het gekozen antwoord leuk. Het is echter meestal langzamer dan awk, omdat er 2 tools nodig zijn om het werk te doen.

$ wc -l file
49999998 file
$ time paste -sd+ file | bc
1448700364
real    1m36.960s
user    1m24.515s
sys     0m1.772s
$ time awk '{s+=$1}END{print s}' file
1448700364
real    0m45.476s
user    0m40.756s
sys     0m0.287s

Antwoord 3, autoriteit 8%

De volgende opdracht voegt alle regels toe (eerste veld van de awk-uitvoer)

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

Antwoord 4, autoriteit 6%

Tellen twee regels?

awk '{ sum += $1; }
     END { print sum; }' "[email protected]"

Je kunt het dan gebruiken zonder de overbodige ‘kat’:

sum < FileWithColumnOfNumbers.txt
sum   FileWithColumnOfNumbers.txt

FWIW: op MacOS X kun je het doen met een one-liner:

awk '{ sum += $1; } END { print sum; }' "[email protected]"

Antwoord 5, autoriteit 2%

[een vervolg op de reacties van ghostdog74]

bash-2.03$ uname -sr
SunOS 5.8
bash-2.03$ perl -le 'print for 1..49999998' > infile
bash-2.03$ wc -l infile
 49999998 infile
bash-2.03$  time paste -sd+ infile | bc
bundling space exceeded on line 1, teletype
Broken Pipe
real    0m0.062s
user    0m0.010s
sys     0m0.010s
bash-2.03$ time nawk '{s+=$1}END{print s}' infile
1249999925000001
real    2m0.042s
user    1m59.220s
sys     0m0.590s
bash-2.03$ time /usr/xpg4/bin/awk '{s+=$1}END{print s}' infile
1249999925000001
real    2m27.260s
user    2m26.230s
sys     0m0.660s
bash-2.03$ time perl -nle'
  $s += $_; END { print $s }
   ' infile
1.249999925e+15
real    1m34.663s
user    1m33.710s
sys     0m0.650s

Antwoord 6

U kunt bc (rekenmachine) gebruiken. Ervan uitgaande dat uw bestand met #s “n” wordt genoemd:

$ cat n
1
2
3
$ (cat n | tr "\012" "+" ; echo "0") | bc 
6

De trverandert alle nieuwe regels in “+”; dan voegen we 0 toe na de laatste plus, dan pijpen we de uitdrukking (1+2+3+0) naar de rekenmachine

Of, als je het goed vindt om awk of perl te gebruiken, hier is een Perl-oneliner:

$perl -nle '$sum += $_ } END { print $sum' n
6

Antwoord 7

while read -r num; do ((sum += num)); done < inputfile; echo $sum

Antwoord 8

Gebruik een for-lus om uw bestand te herhalen …

sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum

Antwoord 9

Als je ruby ​​hebt geïnstalleerd

cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)"

Antwoord 10

[[email protected] ~]# (find / -xdev -size +1024M) | (while read a ; do aa=$(du -sh $a | cut -d "." -f1 ); o=$(( $o+$aa )); done; echo "$o";)

Other episodes