ব্যাশে wc থেকে কেবল পূর্ণসংখ্যা পান


115

পূর্ণসংখ্যাটি পাওয়ার কী কোনও উপায় আছে যা ডাব্লুসিটি ব্যাশে ফিরে আসে?

মূলত আমি ফাইলের নামের পরে পর্দায় লাইন নম্বর এবং শব্দ সংখ্যাটি লিখতে চাই।

output: filename linecount wordcount আমার এখন পর্যন্ত যা আছে তা এখানে:

files=`ls`
for f in $files;
do
        if [ ! -d $f ] #only print out information about files !directories
        then
                # some way of getting the wc integers into shell variables and then printing them
                echo "$f $lines $ words"
        fi
done

উত্তর:


57

আউটপুটটির cutপ্রথম শব্দটি wc(যা লাইন বা শব্দের গণনা) এর জন্য আপনি কমান্ডটি ব্যবহার করতে পারেন :

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`

5
একই ফাইলের জন্য দুইবার ডাব্লুসিসি চালানো অদক্ষ।
গাভি

3
সত্য, এ কারণেই আমি মনে করি জেমস ব্রডহেডের উত্তরটি আরও ভাল। আমি cutপুরো আউটপুটটিতে কাজ করতে পারিনি wc $fকারণ ক্ষেত্রের মধ্যে ফাঁকের সংখ্যা পৃথক হয়।
ক্যাসাব্ল্যাঙ্কা

1
@ ক্যাসাব্ল্যাঙ্কা আপনি 'টিআর-এস' ব্যবহার করে স্পেসের সংখ্যাটি বার করতে পারবেন। আমি নীচে আমার উত্তরে এই প্রশ্নের আরও বহনযোগ্য সমাধান তালিকাভুক্ত করেছি।
রুবেল

যেহেতু এই উত্তরে আমরা একটি পরিবর্তনশীল যাও বরাদ্দ করছি, আমরা শূণ্যস্থান হত্যা করতে পারে
cycollins

88

সবচেয়ে সহজ উত্তর:

wc < filename 

5
তবে পছন্দসই আউটপুট উত্পাদন করে না।
ডেভ নিউটন

নিশ্চিত যে এটি হয়, আপনি ঠিক যে প্যারামিটারগুলিতে যাইহোক পাস করতে পারেন। উদাহরণস্বরূপ, আপনি যদি wc -c < file nameএটি করেন তবে এটি আপনাকে কেবলমাত্র পূর্ণসংখ্যার সংখ্যা বাইট এবং অন্য কিছুই দেবে না।
কলানীল

13
আমার বক্তব্যটি হ'ল আপনি যদি কোনও (1.5 বছরের পুরানো) প্রশ্নের উত্তর দিতে যাচ্ছেন তবে উত্তরের মধ্যে সমস্ত তথ্য put
ডেভ নিউটন

ওফস, কেবল প্রশ্নটি পুনরায় পড়ুন .. # ব্যর্থ, আমি কীভাবে কেবল পূর্ণসংখ্যাগুলি পেতে পারি তা নিয়ে গবেষণা করছিলাম এবং আমি যখন একটি ভাল উত্তর আবিষ্কার করেছি তখন উত্তরগুলির মধ্যে একটি থেকে তথ্য ব্যবহার করছিলাম এবং তারপরে এটি পোস্ট করার সিদ্ধান্ত নিয়েছিলাম। দুঃখিত ..
কলানীল

3
আপনি গুগলের উত্তর দিয়েছেন, এটিই গণনা করে। :-)
সিরো সান্তিলি 法轮功 冠状 病 六四 事件 法轮功

82

শুধু:

wc -l < file_name

কাজ করবে তবে এই আউটপুটটিতে উপসর্গযুক্ত হোয়াইটস্পেস অন্তর্ভুক্ত রয়েছে wcকারণ সংখ্যাটি ডান-সারিবদ্ধ করে।


3
হোয়াইটস্পেস ছাড়াই কেবল রেখার গণনা পেতে: wc -l < foo.txt | xargsরেফ - স্ট্যাকওভারফ্লো.com
টেলর এডমিস্টন

1
সুতরাং, কমান্ডটি শীর্ষস্থানীয় স্থানগুলির সাথে একটি উত্তর তৈরি করার সময়, প্রশ্নকর্তা একটি পরিবর্তনশীলকে বরাদ্দ করছিলেন এবং এটি স্বয়ংক্রিয়ভাবে শীর্ষস্থানগুলি ড্রপ করে (কমপক্ষে এটি পুরানো ওএসএক্স বাশে আমার অভিজ্ঞতা ছিল)। অন্য কথায়, lines=`wc -l < $f`একটি পরিবর্তনশীল "লাইন" এর ফলাফল যার মানের কোনও অগ্রণী স্থান নেই।
সাইকোলিনস

আমি যদি পাইপ দিয়ে পাই? আমি একটি ত্রুটি পেয়েছি: find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -lঠিক আছে তবে প্রতিটি ফাইল মুদ্রণ করে। আমি যদি ব্যবহার find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <করি তবে আমি একটি ত্রুটি পাই। parse error near '\n'
নুনো

55
wc $file | awk {'print "$4" "$2" "$1"'}

আপনার লেআউটের জন্য প্রয়োজনীয় হিসাবে সামঞ্জস্য করুন।

নেতিবাচক ("ডিরেক্টরি নয়") ওপরে ইতিবাচক যুক্তি ("একটি ফাইল এটি") ব্যবহার করা আরও ভাল

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}

1
আমার উইন্ডোজে সিএমডারে (ব্যাশ ৪.৪.১২) এটি কাজ করে: wc $file | awk '{print $4" "$2" "$1}'- এর বাইরে অ্যাস্ট্রোফেস {}
গ্রেজগোর্জ গিয়ারিক

36

কখনও কখনও wc আউটপুট বিভিন্ন প্ল্যাটফর্মের বিভিন্ন ফর্ম্যাটে। উদাহরণ স্বরূপ:

ওএস এক্সে:

$ echo aa | wc -l

         1

সেন্টোসে:

$ echo aa | wc -l

1

সুতরাং কেবল কাটা ব্যবহারটি নম্বরটি পুনরুদ্ধার করতে পারে না। পরিবর্তে ট্র ট্র্যাক করে স্থানের অক্ষর মুছতে:

$ echo aa | wc -l | tr -d ' '

23

গৃহীত / জনপ্রিয় উত্তর দেয় না ওএসএক্সে কাজ করে ।

নিম্নলিখিত যে কোনওটি বিএসডি এবং লিনাক্সে পোর্টেবল হতে হবে।

wc -l < "$f" | tr -d ' '

অথবা

wc -l "$f" | tr -s ' ' | cut -d ' ' -f 2

অথবা

wc -l "$f" | awk '{print $1}'

11

আপনি যদি এর মধ্যে ফাইলের নাম পুনর্নির্দেশ করেন তবে wcআউটপুট-এ ফাইলের নাম বাদ পড়ে।

ব্যাশ:

read lines words characters <<< $(wc < filename)

অথবা

read lines words characters <<EOF
$(wc < filename)
EOF

forএর আউটপুটটি পুনরাবৃত্তি করার পরিবর্তে lsএটি করুন:

for f in *

স্পেস অন্তর্ভুক্ত ফাইলের নাম থাকলে এটি কাজ করবে।

যদি আপনি গ্লোববিং ব্যবহার করতে না পারেন তবে আপনার একটি while readলুপে পাইপ করা উচিত :

find ... | while read -r f

বা প্রক্রিয়া বিকল্প ব্যবহার করুন

while read -r f
do
    something
done < <(find ...)

যাইহোক আমি আপনাকে উত্সাহিত করেছি, তবে আপনাকে ফাইলের নাম পুনর্নির্দেশ করার দরকার নেই। এটি কেবল অতিরিক্ত ক্ষেত্র হিসাবে ক্যাপচার করুন। read lines words characters filename <<< $(wc "$f")ওহ, এবং যদি আপনি স্পেসগুলির বিরুদ্ধে শক্ত করতে * ব্যবহার করেন তবে আপনি যখন ভেরটি ব্যবহার করেন তখন ডাবল উদ্ধৃতিও দিতে চান।
ব্রুনো ব্রোনোস্কি

অতিরিক্ত ভেরিয়েবল ব্যবহার করা এটির অন্য উপায়, তবে আপনি যদি ভেরিয়েবলটি ব্যবহার না করে থাকেন (সম্ভবত আপনার ইতিমধ্যে কোনও ভেরিয়েবলের ফাইলের নাম রয়েছে - $fএই ক্ষেত্রে), এটি অপ্রয়োজনীয়। এছাড়াও, ওপিতে কীভাবে কেবল পূর্ণসংখ্যা পাওয়া যায় তা জানতে চেয়েছিল । আপনি একটি ভেরিয়েবল উদ্ধৃত করার বিষয়ে সঠিক, কিন্তু আমি ভেরিয়েবলটির ব্যবহারটি দেখাইনি, সুতরাং আমি সেই বিন্দুর উল্লেখ বাদ দিয়েছি। আপনি জানেন যে for f in *ফর্মটি প্রায়শই সর্বদা আউটপুট ব্যবহার করার পরিবর্তে ব্যবহার করা উচিত ls
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

আমি সম্পূর্ণরূপে এই বিষয়ে একমত ls। এটি আপনাকে একটি পুরস্কার পাবে partmaps.org/era/unix/award.html#ls
ব্রুনো ব্রোনোস্কি

আপনি যদি ফাইলের read lines words characters _ <<< $(wc "$f")

@ ইভানটিটেলম্যান: আপনার উপরের কয়েকটি মন্তব্যে যেমন আলোচনা হয়েছে। $_শুধুমাত্র একটি ভিন্ন পরিবর্তনশীল।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

3

যদি ফাইলটি ছোট হয় তবে আপনি wcদু'বার কল করতে পারবেন , এবং নীচের মতো কিছু ব্যবহার করুন, যা কোনও অতিরিক্ত প্রক্রিয়াতে পাইপিং এড়ায়:

lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))

$((...))হয় পাটিগণিত সম্প্রসারণ ব্যাশ করুন। এটি wcএই ক্ষেত্রে আউটপুট থেকে যে কোনও সাদা স্থান সরিয়ে দেয় ।

আপনার যদি লাইনকাউন্ট বা ওয়ার্ডকাউন্টের প্রয়োজন হয় তবে এই সমাধানটি আরও অর্থবোধ করে।




1

সংখ্যার ফলাফলের জন্য এটি ব্যবহার করে দেখুন:
nlines = $ (wc -l <$ মাইফাইল)


0

এটা চেষ্টা কর:

wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE  " words: " WC }'

এটি একটি লাইন গণনা এবং শব্দের গণনা (লাইন এবং ডাব্লুসি) তৈরি করে এবং ডাব্লুসি থেকে প্রাপ্ত প্রথম মানগুলির সাথে (প্রথম স্তরের মানের জন্য 1 ডলার এবং দ্বিতীয়টির জন্য 2 ডলার) ব্যবহার করে এবং ফলগুলি মুদ্রণ করে।


0

"মূলত আমি ফাইলের নামের পরে পর্দায় লাইন নম্বর এবং শব্দ সংখ্যাটি লিখতে চাই" "

answer=(`wc $f`)
echo -e"${answer[3]}
lines:  ${answer[0]}
words:  ${answer[1]}
bytes:  ${answer[2]}"

আউটপুট: myfile.txt লাইন: 10 শব্দ: 20 বাইট: 120


0
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"

আপনি যদি perlযাইহোক ব্যবহার করে থাকেন তবে পার্লে শব্দ গণনাও করতে পারেন। আরও অর্থনৈতিক পন্থা tr -d '[:space:]'
হ'ল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.