একটি নির্দিষ্ট দৈর্ঘ্যের মধ্যে আমি কীভাবে ফাইলগুলিতে লাইনগুলি সনাক্ত করতে পারি


12

আমি আমার কোডে একটি নির্দিষ্ট দৈর্ঘ্যের চেয়ে বেশি লাইন খুঁজে পেতে চাই। আমার কোড একাধিক ফাইলে রয়েছে। এটি করার একটি ভাল উপায় কি?

আমি ফাইল এবং লাইন নম্বর জানতে চাই; বিষয়বস্তু পছন্দ করা হবে, কিন্তু প্রয়োজন হয় না। অনুশীলনের উদ্দেশ্যটি হ'ল লাইনগুলি কীভাবে ভাঙ্গতে হয় (সম্ভবত ম্যানুয়ালি)।


আপনি কীভাবে ফলাফল চান? লাইনগুলি নিজেই (তাদের সামগ্রী হিসাবে, হিসাবে grep), বা লাইন সংখ্যা হিসাবে বা অন্য কিছু হিসাবে (সম্ভবত আপনি তাদের উপর অন্য কোনও পদক্ষেপ প্রয়োগ করতে চান)? সম্ভবত এটি করার সর্বাধিক সম্মিলিত উপায় পরবর্তী লাইনগুলির সাথে কী করা হবে তার উপর নির্ভর করে।
ইম্জ - ইভান জ্যাচারিয়াশেভ

@ ইম্জ - ইভানজখরিয়াচেভ ভাল পয়েন্ট। প্রশ্ন আপডেট হয়েছে।
মার্সিন

উত্তর:


13

সহ grep:

grep -En '.{12}' file

লাইনের জন্য কমপক্ষে 12 টি অক্ষর দীর্ঘ।

বেশ কয়েকটি ফাইল সহ:

find . -type f -exec grep -En '.{12}' {} +

grepজিএনইউ এর মতো কিছু বাস্তবায়ন grepফাইল অনুসন্ধান করতে পারে।

grep -rEn '.{12}' .

তবে সিমলিংক এবং অন্যান্য নিয়মিত ফাইল থেকে সাবধান থাকুন।


আমি এটি পছন্দ করি কারণ এটি সহজ, এবং আমি এটির মতো কিছু করার আশা করছিলাম (এখনও এটি সন্ধান করতে পারে নি)।
মার্সিন

12

AWK সমাধান

awk '{       
if (length($0) > 5)
        print $0;'} yourfile

বা, আরও সংক্ষিপ্তভাবে:

awk 'length > 5' file

9
আমরা আপনার সংস্করণটি সংক্ষিপ্ত করতে পারিawk 'length > 5'
cuonglm

জ্নোক একটি ব্রেস কিলার;)
ওউকি

1
+1 এর জন্যawk 'length > 5'

3
জিএনইউ awkদিয়ে কিছুটা কম মার্জিত তবে সংক্ষিপ্তawk '/^.{6,}/'
ইরুবার ২

3
@ 1_সিআর, এটি পজিক্স এবং সংক্ষিপ্ত করা যেতে পারে awk '/.{6}/'(বাস্তবে জিএনইউ অ্যাড অবধি ব্যবহৃত হবে যেখানে আপনি পসিক্সএলআই_রেক্টটিকে তার পরিবেশে পাস না করে কাজ করবে না)।
স্টাফেন চেজেলাস

5

যেহেতু একটি জিনিস অনুপস্থিত ছিল তা ছিল একটি sedসমাধান

sed -n '/^.\{6,\}/p' file

5

বাশ সমাধান

#!/bin/bash

count=0

while read; do
    ((++count)) 
    len=${#REPLY}
    if ((len > 80)); then
        echo "Line $count is $len characters."
    fi
done

সুতরাং, যেমন ./whatever.sh < input.file,। এতে 1 থেকে 1 টি বিয়োগ করে নতুন লাইন অন্তর্ভুক্ত নয় $len; যদি এটি পছন্দসই না হয়, বা আপনার ইনপুটটি সিআরএলএফ শেষ ব্যবহার করে, আপনার সেই অনুযায়ী সামঞ্জস্য করা উচিত।


1
কাঁটাচামচ ${#line}এড়াতে হবে না কেন expr?
ইরুভার

1
হা হা, খাঁটি bashসমাধানের জন্য +1 । তবে দয়া করে নোট করুন যে আপনি IFS=যদি সামনে না থেকে যান তবে readশীর্ষস্থানীয় স্থানগুলি উপেক্ষা করা হবে।
ইরুভার

1
কয়েকটি ব্যাশ ভাল অভ্যাসে যোগ করা হয়েছে। এছাড়াও দয়া করে নোট করুন যে নতুন লাইনটি নেওয়া হয় নি $lineতাই কোনও বিয়োগ করার প্রয়োজন নেই।
ইরুভার

2
@ 1_CR আসলে যদি আপনি এতে readপড়ার জন্য কোনও নাম না দেন তবে এটি পড়বে REPLYএবং সমস্ত শ্বেতক্ষেত্র অন্তর্ভুক্ত করবে । কোনও IFSসেটিংয়ের দরকার নেই।
কোজিরো

2
এটি অত্যন্ত ধীর হতে চলেছে এবং ব্যাকস্ল্যাশ অক্ষরগুলিকে বিশেষভাবে পরিচালনা করে। while readপাঠ্য প্রক্রিয়াকরণের লুপগুলি সত্যই খারাপ অনুশীলন।
স্টাফেন চেজেলাস

4

সঙ্গে perl(উদাহরণস্বরূপ), আপনি অভিমানী 80 অক্ষরের বেশি লাইনের জন্য অনুসন্ধান করা হয়:

লাইনগুলি প্রদর্শন করতে:

$ perl -nle 'print if length > 80' your_file

লাইন নম্বর প্রদর্শন করতে:

$ perl -nle 'print "$.\n" if length > 80' your_file

অথবা উভয়:

$ perl -nle 'print "[$.]:  $_\n" if length > 80' your_file

3
আপনার -lকমান্ড লাইন যুক্ত করা উচিত , perlআপনার লাইনে লাইন বিরতি গণনা করবে।
cuonglm

1

রুবি:

ruby -lne 'puts $_ if $_.size > 5' intputfile

পাইথন:

python -c "import sys;[ sys.stdout.write(''.join(line)) for line in sys.stdin if len(line.strip()) > 5 ]" < inputfile

1

এখানে আরও একটি বাশ সমাধান (ব্যাশ 4):

minlen=5 # minimum length of a line
mapfile -tO1 < inputfile # Map the file to the array MAPFILE (by default)
                         # Start the array at index 1
for i in "${!MAPFILE[@]}"; do
  (( ${#MAPFILE[i]} > minlen )) || unset MAPFILE[i] # Remove shorter elements
done

ফলস্বরূপ অ্যারে অপ্রয়োজনীয়, সুতরাং অ্যারে সূচকগুলি বজায় থাকে। যেহেতু আমরা 1 এ শুরু করেছি, সূচকগুলি হ'ল আমরা রেখার রেখার সংখ্যা। আমরা কেবল সেই লাইন সংখ্যাগুলি আউটপুট করতে পারি:

printf 'Long lines found at: '
printf '%d, ' "${!MAPFILE[@]}"
echo

অথবা আমরা লাইনগুলি নিজেরাই আউটপুট করতে পারি:

printf '%s\n' "${MAPFILE[@]}"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.