ফাইলগুলির একটি তালিকা দেওয়া files.txt
, আমি এই জাতীয় আকারগুলির একটি তালিকা পেতে পারি:
cat files.txt | xargs ls -l | cut -c 23-30
যা এরকম কিছু তৈরি করে:
151552
319488
1536000
225280
আমি কিভাবে পেতে পারেন মোট সমস্ত সংখ্যার?
ফাইলগুলির একটি তালিকা দেওয়া files.txt
, আমি এই জাতীয় আকারগুলির একটি তালিকা পেতে পারি:
cat files.txt | xargs ls -l | cut -c 23-30
যা এরকম কিছু তৈরি করে:
151552
319488
1536000
225280
আমি কিভাবে পেতে পারেন মোট সমস্ত সংখ্যার?
উত্তর:
... | paste -sd+ - | bc
আমি খুঁজে পাওয়া সংক্ষিপ্ততমটি ( ইউনিক্স কমান্ড লাইন ব্লগ থেকে)।
সম্পাদনা করুন:-
বহনযোগ্যতার জন্য যুক্তি যুক্ত করেছেন , ধন্যবাদ @ ডগবার্ট এবং @ ওউইন।
alias sum="paste -sd+ - | bc"
শেল সমাপ্তিতে যোগ হয়েছে, ধন্যবাদ সাথী
. . .| x=$(echo <(cat)); echo $((0+${x// /+}+0))
আপনি যদি
/usr/bin/sum
bc
কিছু সিস্টেমে পাওয়া যায় না! awk
অন্যদিকে, পসিক্স সম্মতির জন্য প্রয়োজনীয় (আমি বিশ্বাস করি)।
এখানে যায়
cat files.txt | xargs ls -l | cut -c 23-30 |
awk '{total = total + $1}END{print total}'
cut
? এটি একটি পূর্বাভাসযোগ্য কলাম নম্বর, তাই ব্যবহার করুন... | xargs ls -l | awk '{total = total + $5}{END{print total}'
total+=$1
পরিবর্তে ব্যবহার করতে পারেনtotal = total + $1
python3 -c"import os; print(sum(os.path.getsize(f) for f in open('files.txt').read().split()))"
অথবা আপনি যদি কেবল সংখ্যার যোগ করতে চান তবে পাইপটি এখানে করুন:
python3 -c"import sys; print(sum(int(x) for x in sys.stdin))"
... | python -c'import sys; print(sum(int(x) for x in sys.stdin))'
যখন পাইথন 2 এই বছরের শেষে অদৃশ্য হয়ে যায়।
আপনার স্ট্যাটাস থাকলে পুরো এলএস-এল এবং তারপরে কাটা বরং গুলিয়ে যায় । এটি ls -l এর সঠিক বিন্যাসেও ঝুঁকিপূর্ণ (আমি কাটার জন্য কলাম নম্বরগুলি পরিবর্তন না করা পর্যন্ত এটি কাজ করে না )
এছাড়াও, বিড়ালের অকেজো ব্যবহার স্থির করুন ।
<files.txt xargs stat -c %s | paste -sd+ - | bc
<infile command
এটি একই (এবং এর চেয়ে ভাল ক্রমে) command <infile
।
আপনার কাছে বিসি ইনস্টল না থাকলে চেষ্টা করুন
echo $(( $(... | paste -sd+ -) ))
পরিবর্তে
... | paste -sd+ - | bc
$( )
<- কমান্ড কার্যকর করার মানটি ফিরিয়ে দিন
$(( 1+2 ))
<- মূল্যায়ন ফলাফল ফিরে
echo
<- এটি স্ক্রিনে প্রতিধ্বনিত করুন
আপনি যদি কেবল অজস্র বা অন্য অনুবাদক ছাড়াই শেল স্ক্রিপ্টিং ব্যবহার করতে চান তবে আপনি নিম্নলিখিত স্ক্রিপ্টটি ব্যবহার করতে পারেন:
#!/bin/bash
total=0
for number in `cat files.txt | xargs ls -l | cut -c 23-30`; do
let total=$total+$number
done
echo $total
আমি পরিবর্তে "ডু" ব্যবহার করব।
$ cat files.txt | xargs du -c | tail -1
4480 total
আপনি যদি কেবল সংখ্যাটি চান:
cat files.txt | xargs du -c | tail -1 | awk '{print $1}'
files.txt
বড় হলে কাজ করবে না । যদি পাইপযুক্ত আর্গুমেন্টগুলির সংখ্যা xargs
নির্দিষ্ট প্রান্তিকের কাছে পৌঁছায়, এটি তাদের একাধিক কলের মাধ্যমে ভেঙে দেয় du
। শেষে প্রদর্শিত মোটটি du
পুরো তালিকা নয়, কেবলমাত্র শেষ কলের জন্য মোট ।
Ksh এ:
echo " 0 $(ls -l $(<files.txt) | awk '{print $5}' | tr '\n' '+') 0" | bc
cut
, তবে আপনি গণিত করার দক্ষতা উপেক্ষা করছেন ...
#
# @(#) addup.sh 1.0 90/07/19
#
# Copyright (C) <heh> SjB, 1990
# Adds up a column (default=last) of numbers in a file.
# 95/05/16 updated to allow (999) negative style numbers.
case $1 in
-[0-9])
COLUMN=`echo $1 | tr -d -`
shift
;;
*)
COLUMN="NF"
;;
esac
echo "Adding up column .. $COLUMN .. of file(s) .. $*"
nawk ' OFMT="%.2f" # 1 "%12.2f"
{ x = '$COLUMN' # 2
neg = index($x, "$") # 3
if (neg > 0) X = gsub("\\$", "", $x)
neg = index($x, ",") # 4
if (neg > 1) X = gsub(",", "", $x)
neg = index($x, "(") # 8 neg (123 & change
if (neg > 0) X = gsub("\\(", "", $x)
if (neg > 0) $x = (-1 * $x) # it to "-123.00"
neg = index($x, "-") # 5
if (neg > 1) $x = (-1 * $x) # 6
t += $x # 7
print "x is <<<", $x+0, ">>> running balance:", t
} ' $*
# 1. set numeric format to eliminate rounding errors
# 1.1 had to reset numeric format from 12.2f to .2f 95/05/16
# when a computed number is assigned to a variable ( $x = (-1 * $x) )
# it causes $x to use the OFMT so -1.23 = "________-1.23" vs "-1.23"
# and that causes my #5 (negative check) to not work correctly because
# the index returns a number >1 and to the neg neg than becomes a positive
# this only occurs if the number happened to b a "(" neg number
# 2. find the field we want to add up (comes from the shell or defaults
# to the last field "NF") in the file
# 3. check for a dollar sign ($) in the number - if there get rid of it
# so we may add it correctly - $12 $1$2 $1$2$ $$1$$2$$ all = 12
# 4. check for a comma (,) in the number - if there get rid of it so we
# may add it correctly - 1,2 12, 1,,2 1,,2,, all = 12 (,12=0)
# 5. check for negative numbers
# 6. if x is a negative number in the form 999- "make" it a recognized
# number like -999 - if x is a negative number like -999 already
# the test fails (y is not >1) and this "true" negative is not made
# positive
# 7. accumulate the total
# 8. if x is a negative number in the form (999) "make it a recognized
# number like -999
# * Note that a (-9) (neg neg number) returns a postive
# * Mite not work rite with all forms of all numbers using $-,+. etc. *
cat files.txt | awk '{ total += $1} END {print total}'
আপনি কাজটি করতে একইভাবে এটি ব্যবহার করতে পারেন এটি এমনকি অ ইন্টিজারগুলিও এড়িয়ে যায়
$ cat files.txt
1
2.3
3.4
ew
1
$ cat files.txt | awk '{ total += $1} END {print total}'
7.7
অথবা আপনি ls কমান্ড ব্যবহার করতে পারেন এবং মানব পাঠযোগ্য আউটপুট গণনা করতে পারেন
$ ls -l | awk '{ sum += $5} END {hum[1024^3]="Gb"; hum[1024^2]="Mb"; hum[1024]="Kb"; for (x=1024^3; x>=1024; x/=1024) { if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x]; break; } } if (sum<1024) print "1kb"; }'
15.69 Mb
$ ls -l *.txt | awk '{ sum += $5} END {hum[1024^3]="Gb"; hum[1024^2]="Mb"; hum[1024]="Kb"; for (x=1024^3; x>=1024; x/=1024) { if (sum>=x) { printf "%.2f %s\n",sum/x,hum[x]; break; } } if (sum<1024) print "1kb"; }'
2.10 Mb
awk '{ total += $1} END {print total}' files.txt
খাঁটি বাশ
total=0; for i in $(cat files.txt | xargs ls -l | cut -c 23-30); do
total=$(( $total + $i )); done; echo $total
sizes=( $(cat files.txt | xargs ls -l | cut -c 23-30) )
total=$(( $(IFS="+"; echo "${sizes[*]}") ))
অথবা আপনি মাপগুলি পড়ার সাথে সাথে সেগুলি যোগ করতে পারেন
declare -i total=0
while read x; total+=x; done < <( cat files.txt | xargs ls -l | cut -c 23-30 )
আপনি যদি কামড়ের আকার এবং ব্লকগুলি সম্পর্কে চিন্তা করেন না তবে ঠিক
declare -i total=0
while read s junk; total+=s; done < <( cat files.txt | xargs ls -s )
আপনার যদি আর থাকে তবে আপনি এটি ব্যবহার করতে পারেন:
> ... | Rscript -e 'print(sum(scan("stdin")));'
Read 4 items
[1] 2232320
যেহেতু আমি আর এর সাথে স্বাচ্ছন্দ্য বোধ করছি, আমার কাছে আসলে এই জাতীয় জিনিসের জন্য বেশ কয়েকটি উপাত্ত রয়েছে যাতে আমি bash
এই বাক্য গঠনটি মনে না রেখেই এগুলিকে ব্যবহার করতে পারি । এই ক্ষেত্রে:
alias Rsum=$'Rscript -e \'print(sum(scan("stdin")));\''
যা আমাকে করুক
> ... | Rsum
Read 4 items
[1] 2232320
অনুপ্রেরণা: একক কমান্ডে ন্যূনতম, সর্বোচ্চ, মধ্যম এবং গড় সংখ্যাগুলির তালিকা পাওয়ার কোনও উপায় কি?