ফাইলের শেষে ফাঁকা রেখার সংখ্যা গণনা করুন


11

ফাইলটির শেষে ফাঁকা লাইন সহ আমার একটি ফাইল রয়েছে। grepস্ক্রিপ্টে ভেরিয়েবল হিসাবে ফাইলের নামটি পাস করার পরে আমি ফাইলটির শেষে ফাঁকা রেখার সংখ্যা গণনা করতে পারি ?


একটানা ফাঁকা লাইনের সংখ্যা গণনা করতে ?
রোমানপেরেখারেস্ট

2
@ রোমানপেরেখারেস্ট আমি তাই বলব, নাহলে তারা "ফাইলের শেষে" হবে না?
স্পারহাক

'grep -cv -P' 'S' ফাইলের নামটি ফাইলের মোট ফাঁকা রেখার সংখ্যা গণনা করবে। নম্বরটি কেবল আমার মস্তিষ্ককে ট্যাক্স করছে!
মাইকেল জন

ওপি grepআমার বইতে বিশুদ্ধতার জন্য @ মিশেল জন জয়ের জন্য বলেছে ।
bu5hman

2
@ bu5hman তবে (যেমন তিনি স্বীকার করেছেন) প্রশ্নের উত্তর দেয় না। বা সত্যিই, আপনার না।
স্পারহাক

উত্তর:


11

যদি ফাঁকা লাইনগুলি কেবল শেষে থাকে

grep  -c '^$' myFile

বা:

grep -cx '' myFile

সেকেন্ডের দ্বারা সম্পাদনাটিকে
মারধর

grep -cv . myFileএটি লেখার আরেকটি উপায় (কোড গল্ফারদের জন্য)। তবে আমি grepফাইলটির কোথাও খালি লাইন থাকলে একটি সমাধান পেয়েছি ।
ফিলিপস

2
@ ফিলিপোস, grep -cv .এমন লাইনগুলিও গণনা করবে যাতে কেবলমাত্র বাইট থাকে যা বৈধ অক্ষর তৈরি করে না।
স্টাফেন চেজেলাস

11

কেবল মজাদার জন্য, কিছু ভুতুড়ে sed:

#!/bin/sh
sed '/./!H;//h;$!d;//d;x;s/\n//' "$1" | wc -l

ব্যাখ্যা:

  • /./যে কোনও অক্ষরের সাথে লাইনগুলিকে সম্বোধন করে, তাই /./!শূন্য নয় লাইনগুলি সম্বোধন করে; তাদের জন্য, Hকমান্ড তাদের হোল্ড স্পেসে যুক্ত করবে। সুতরাং, যদি প্রতিটি খালি লাইনের জন্য আমরা হোল্ড স্পেসে একটি লাইন যুক্ত করে থাকি তবে সবসময় খালি লাইনের সংখ্যার চেয়ে আরও একটি লাইন থাকে। আমরা পরে এটি যত্ন করব।
  • //hখালি প্যাটার্নটি সর্বশেষ নিয়মিত প্রকাশের সাথে মেলে যা কোনও চরিত্র ছিল, সুতরাং যে কোনও ফাঁকা লাইন সম্বোধন করে সংগ্রহ করা লাইনগুলিকে "পুনরায় সেট করতে" কমান্ড দ্বারা হোল্ড স্পেসে স্থানান্তরিত করা hহয়। যখন পরবর্তী ফাঁকা লাইন যুক্ত হবে, প্রত্যাশা অনুযায়ী আবার দু'জন আসবে।
  • $!dশেষ লাইনটি ছাড়াও স্ক্রিপ্টটি আউটপুট ছাড়াই থামায়, সুতরাং আরও কমান্ড কেবল শেষ লাইনের পরে কার্যকর করা হবে। সুতরাং আমরা হোল্ড স্পেসে যা কিছু খালি লাইন সংগ্রহ করেছি তা ফাইলের শেষে। ভাল.
  • //d: dকমান্ডটি কেবলমাত্র খালি খালি লাইনের জন্যই কার্যকর করা হয়। সুতরাং যদি শেষ লাইনটি খালি না থাকে তবে sedকোনও আউটপুট ছাড়াই প্রস্থান করবে। শূন্য লাইন। ভাল.
  • x এক্সচেঞ্জগুলি স্থান এবং প্যাটার্ন স্পেস ধারণ করে, তাই সংগ্রহ করা লাইনগুলি এখন প্রক্রিয়া করার জন্য প্যাটার্ন স্পেসে রয়েছে।
  • তবে আমরা মনে করি যে একটি লাইন খুব বেশি রয়েছে, তাই আমরা একটি নতুন লাইনটি সরিয়ে এটি হ্রাস করি s/\n//
  • ভাল খবর! লাইনের সংখ্যা শেষে খালি লাইনের সংখ্যার সাথে মেলে (মনে রাখবেন যে প্রথম লাইনটি খালি হবে না, তবে কে যত্নশীল), তাই আমরা সেগুলি দিয়ে গণনা করতে পারি wc -l

8

আরও কিছু জিএনইউ tac/ tail -rবিকল্পসমূহ:

tac file | awk 'NF{exit};END{print NR?NR-1:0}'

বা:

tac file | sed -n '/[^[:blank:]]/q;p' | wc -l

মনে রাখবেন যে এর ফলাফল:

printf 'x\n '

এটি হ'ল, সর্বশেষ পূর্ণ লাইনের পরে যেখানে অতিরিক্ত স্থান রয়েছে (যা কিছু লোক অতিরিক্ত ফাঁকা রেখা হিসাবে বিবেচনা করতে পারে তবে পাঠ্যের POSIX সংজ্ঞা অনুসারে বৈধ পাঠ্য নয়), সেগুলি 0 দেবে।

POSIXly:

awk 'NF{n=NR};END{print NR-n}' < file

তবে এর অর্থ ফাইলটি পুরোপুরি পড়া ( tail -r/ tacসন্ধানযোগ্য ফাইলগুলির মধ্যে ফাইলটি শেষ থেকে পিছিয়ে পড়া হবে)। যে 1আউটপুট দেয় printf 'x\n '


6

আপনি যেমন কোনও grepসমাধানের জন্য জিজ্ঞাসা করছেন আমি কেবল এটি জিএনইউতে নির্ভর করে এটি যুক্ত করি grep(ঠিক আছে, শেল সিনট্যাক্স এবং echo...) ব্যবহার করে :

#!/bin/sh
echo $(( $(grep -c "" "$1") - $(grep -B$(grep -cv . "$1") . "$1" |grep -c "") ))

আমি এখানে কি করছেন? $(grep -c ".*" "$1")ফাইলের সমস্ত লাইন গণনা করা হয়, তারপরে আমরা ফাঁকা লাইনগুলি অনুসরণ না করে ফাইলটি বিয়োগ করতে পারি।

এবং কিভাবে এটি পেতে? $(grep -B42 . "$1"সমস্ত খালি-ফাঁকা রেখা এবং তাদের আগে 42 লাইন গ্রেপ করে দেবে, সুতরাং এটি সর্বশেষ নন-খালি লাইন পর্যন্ত মুদ্রণ করবে, যতক্ষণ না খালি খালি লাইনের আগে পরপর 42 টির বেশি খালি লাইন না থাকে। এই সীমাটি এড়াতে, আমি বিকল্পটির $(grep -cv . "$1")প্যারামিটার হিসাবে নিই -B, যা খালি লাইনের মোট সংখ্যা, তাই সর্বদা যথেষ্ট বড়। এইভাবে আমি খালি লাইনগুলি অনুসরণ করে চলেছি এবং লাইনগুলি |grep -c ".*"গণনা করতে ব্যবহার করতে পারি ।

উজ্জ্বল, তাই না? (-;


+1 কারণ যদিও এটি ভয়াবহ কোড, এটি প্রযুক্তিগতভাবে জিজ্ঞাসিত প্রশ্নের উত্তর দেয় এবং আমি আপনাকে চিহ্নিত করতে পারি না ;-)
রোয়াইমা

Grepmeister। আমরা যোগ্য নই।
bu5hman

বিকৃততার জন্য +1। আরেকটি (সম্ভবত দ্রুত?) বিকল্পটি tac | grepপ্রথমে শূন্য নয় -m -A 42, তারপরে বিয়োগ করবে। আমি নিশ্চিত কোনটি আরও কার্যকর, তবে আপনি wc -l | cut -d' ' -f1ফাঁকা লাইনগুলি চেপে ধরার পরিবর্তেও পারতেন ?
স্পারহক

হ্যাঁ, নিশ্চিত, আপনার সাথে একটা অনেক কি করতে পারেন tac, wcএবং cut, কিন্তু এখানে আমি নিজেকে সীমাবদ্ধ করার চেষ্টা grep। আপনি এটিকে বিকৃতি বলতে পারেন, আমি এটিকে স্পোর্টস বলি। (-;
ফিলিপোস

5

আর একটি awkসমাধান। এই প্রকরণটি kপ্রতিবার একটি খালি ফাঁকা রেখা না থাকলে কাউন্টারটিকে পুনরায় সেট করে । তারপরে, প্রতিটি লাইন কাউন্টারকে বাড়িয়ে দেয়। (সুতরাং, প্রথম প্রথম খালি দৈর্ঘ্যের লাইন পরে k==0।) শেষে আমরা গণনা করা রেখার সংখ্যা আউটপুট করি।

ডেটা ফাইল প্রস্তুত করুন

cat <<'X' >input.txt
aaa

bbb
ccc



X

নমুনায় পিছনের ফাঁকা রেখা গণনা করুন

awk 'NF {k=-1}; {k++}; END {print k+0}' input.txt
3

এই সংজ্ঞায়, একটি ফাঁকা রেখায় ফাঁকা স্থান বা অন্যান্য ফাঁকা অক্ষর থাকতে পারে; এটি এখনও ফাঁকা আপনি যদি খালি লাইনের পরিবর্তে খালি লাইন গণনা করতে চান তবে এর জন্য পরিবর্তন NFকরুন $0 != ""


কেন $0 > ""? যে ব্যবহারসমূহ strcoll()যা কম দক্ষ হবে চেয়ে $0 != ""যা ব্যবহার memcmp()অনেক বাস্তবায়নের মধ্যে (POSIX ব্যবহার করার জন্য এটি প্রয়োজন ব্যবহৃত strcoll()যদিও)।
স্টাফেন চেজেলাস

@ স্টাফেনচেজেলাস আমি এর $0 > ""চেয়ে আলাদা হতে পারিনি $0 != ""। আমি awkযাইহোক "ধীর" অপারেটর হিসাবে আচরণ করব (যেমন যদি আমি জানতে পারি যে ইনপুট হিসাবে আমার একটি বড় ডেটাসেট পেয়েছে এবং প্রক্রিয়াজাতকরণ সময় সমালোচিত হয়, তবে আমি পরিমাণটি হ্রাস করতে কী করতে পারি awkতা প্রক্রিয়া করতে হবে - আমি grep | awkযেমন পরিস্থিতিতে নির্মাণ ব্যবহার করেছেন )। যাইহোক, আমি কী ধরে নিয়েছি সে সম্পর্কে একটি তাত্ক্ষণিক দৃষ্টি আকর্ষণ করা হ'ল আমি পসিক্স সংজ্ঞাটি হয় strcoll()বা আমি এর কোনও উল্লেখ দেখতে পাই না memcmp()। আমি কী মিস করছি?
রোয়াইমা

strcoll()== স্ট্রিংগুলি লোকেল-নির্দিষ্ট কোলেশন ক্রম ব্যবহার করে তুলনা করা হবেআগের সংস্করণের সাথে তুলনা করুন । আমিই এটিকে তুলে আনি। আরও দেখুন austingroupbugs.net/view.php?id=963
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলা এমন একটি বাস্তবায়ন যেখানে a <= b && a >= bঅগত্যা একইরকম নয় a == b। সেকি!
রোয়াইমা

যে গনুহ এর ক্ষেত্রে awkবা bash(তার জন্য [[ a < b ]]জন্য উদাহরণস্বরূপ গনুহ সিস্টেমে en_US.UTF -8 লোকেলে অপারেটার) বনাম উদাহরণস্বরূপ (জন্য bash, কেউ <, >, =তাদের জন্য সত্য ফিরে)। তাত্ক্ষণিকভাবে এটি বাশ / অ্যাডাব্লিকের চেয়ে এই লোকেলগুলির সংজ্ঞায় একটি বাগ
স্টাফেন চেজেলাস

2

ফাইলের শেষে একটানা ফাঁকা রেখার সংখ্যা গণনা করতে

সলিড awk+ tacসমাধান:

নমুনা input.txt:

$ cat input.txt
aaa

bbb
ccc



$  # command line 

ক্রিয়া:

awk '!NF{ if (NR==++c) { cnt++ } else exit }END{ print int(cnt) }' <(tac input.txt)
  • !NF- বর্তমান লাইনটি খালি রয়েছে তা নিশ্চিত করে (কোনও ক্ষেত্র নেই)
  • NR==++c- ফাঁকা লাইনের একটানা ক্রম নিশ্চিত করা। ( NR- রেকর্ড নম্বর, ++c- সমানভাবে বর্ধিত সহায়ক কাউন্টার)
  • cnt++- ফাঁকা লাইনের কাউন্টার

আউটপুট:

3

1

আইআইইউসি, নিম্নলিখিত স্ক্রিপ্ট count-blank-at-the-end.shকাজ করবে:

#!/usr/bin/env sh

count=$(tail -n +"$(grep . "$1" -n | tail -n 1 | cut -d: -f1)" "$1" | wc -l)
num_of_blank_lines=$((count - 1))

printf "%s\n" "$num_of_blank_lines"

ব্যবহারের উদাহরণ:

$ ./count-blank-at-the-end.sh FILE
4

আমি এটা পরীক্ষিত GNU bash, Android mkshএবং ksh


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.