Saya ingin bash command yang saya dapat pipa yang akan menjadi jumlah kolom angka. Aku hanya ingin cepat salah satu kapal yang akan melakukan sesuatu yang pada dasarnya seperti ini:
cat FileWithColumnOfNumbers.txt | sum
paste -sd+ infile | bc
<cmd> | paste -sd+ | bc
Edit: Dengan beberapa paste implementasi yang anda butuhkan untuk menjadi lebih eksplisit ketika membaca dari stdin:
<cmd> | paste -sd+ - | bc
Saya suka jawaban yang dipilih. Namun, hal ini cenderung menjadi lebih lambat dari awk sejak 2 alat-alat yang diperlukan untuk melakukan pekerjaan.
$ 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
Apakah dua garis count?
awk '{ sum += $1; }
END { print sum; }' "$@"
Anda kemudian dapat menggunakannya tanpa berlebihan 'kucing':
sum < FileWithColumnOfNumbers.txt
sum FileWithColumnOfNumbers.txt
FWIW: pada MacOS X, anda dapat melakukannya dengan one-liner:
awk '{ sum += $1; } END { print sum; }' "$@"
[ikutan untuk ghostdog74s komentar]
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
Anda dapat menggunakan bc (kalkulator). Dengan asumsi file anda dengan #s disebut "n":
$ cat n
1
2
3
$ (cat n | tr "\012" "+" ; echo "0") | bc
6
The tr
mengubah semua baris baru untuk "+"; kemudian kita tambahkan 0 setelah terakhir ditambah, maka kami pipa ekspresi (1+2+3+0
) untuk kalkulator
Atau, jika anda OK dengan menggunakan awk atau perl, di sini's Perl satu-liner:
$perl -nle '$sum += $_ } END { print $sum' n
6