একটি নির্দিষ্ট অক্ষর বাদে একটি লাইনে অক্ষরের সংখ্যা কীভাবে গণনা করা যায়?


9

এটি পার্ট ফাইল

N W N N N N N N N N N
N C N N N N N N N N N
N A N N N N N N N N N
N N N N N N N N N N N
N G N N N N N N N N N
N C N N N C N N N N N
N C C N N N N N N N N

প্রতিটি লাইনে আমি "N" নয় এমন সমস্ত অক্ষরের মোট সংখ্যা গণনা করতে চাই

আমার ইচ্ছা আউটপুট

1
1
1
0
1
2
2

আপনার sedযত্ন নেই এমন awksed 's/N//g ; s/\s//g' file | awk '{ print length($0); }'
রল্ফ

উত্তর:


13

জিএনইউ বিশ্রী সমাধান:

awk -v FPAT='[^N[:space:]]' '{ print NF }' file
  • FPAT='[^N[:space:]]'- ক্ষেত্রের মান নির্ধারণ করার ধরণ ( Nচর এবং সাদা জায়গা ছাড়া অন্য কোনও চরিত্র )

প্রত্যাশিত আউটপুট:

1
1
1
0
1
2
2


7

ধরে নিলাম যে স্থানের অক্ষর এবং অন্য প্রতিটি লাইনের জন্য গণনা প্রয়োজন N

$ perl -lne 'print tr/N //c' ip.txt 
1
1
1
0
1
2
2
  • trকতগুলি অক্ষর প্রতিস্থাপন করা হয়েছিল তার রিটার্ন মান
  • c দেওয়া অক্ষরের সেট পরিপূরক
  • -lবিকল্পের ব্যবহারটি নোট করুন , একের পর এক ত্রুটি এড়াতে ইনপুট লাইন থেকে নতুন লাইন চরিত্রটি স্ট্রিপ করে এবং মুদ্রণ বিবৃতিতে নিউলাইন অক্ষর যুক্ত করে


আরও জেনেরিক সমাধান

perl -lane 'print scalar grep {$_ ne "N"} @F' ip.txt 
  • -a@Fঅ্যারেতে সংরক্ষিত, সাদা-স্পেসে স্বয়ংক্রিয়ভাবে ইনপুট লাইন বিভক্ত করার বিকল্প
  • grep {$_ ne "N"} @F@Fস্ট্রিংয়ের সাথে মেলে না এমন সমস্ত উপাদানগুলির অ্যারে প্রদান করেN
    • রিজেক্স সমতুল্য হবে grep {!/^N$/} @F
  • ব্যবহার scalarঅ্যারের সংখ্যার দেবে

6

বিকল্প অজানা সমাধান:

awk '{ print gsub(/[^N[:space:]]/,"") }' file
  • gsub(...)- gsub()ফাংশনটি প্রতিস্থাপকের সংখ্যা প্রদান করে।

আউটপুট:

1
1
1
0
1
2
2

6

আরেকটি awkপদ্ধতির ( খালি লাইনের জন্য -1 ফিরে আসবে )।

awk -F'[^N ]' '$0=NF-1""' infile

বা জটিল, এটা ফিরে আসবে -1 খালি লাইন, 0 অনুসরণকারী শূণ্যস্থান (ট্যাব / শূন্যস্থানের) শুধুমাত্র লাইন।

awk -F'[^N \t]+' '$0=NF-1""' infile

-1খালি লাইনের জন্য মুদ্রণ করবে ... তবে তারপরে কেবল এন / স্পেস বনাম খালি লাইন দিয়ে তৈরি লাইনটি আলাদা করা বাঞ্ছনীয় হতে পারে ...
সুন্দীপ

1
@ সন্দীপ হ্যাঁ, এটি সঠিক। আমার
আপডেটটিও

5
  1. trএবং পসিক্স শেল স্ক্রিপ্ট:

    tr -d 'N ' < file | while read x ; do echo ${#x} ; done
    
  2. bash, kshএবং zsh:

    while read x ; do x="${x//[ N]}" ; echo ${#x} ; done < file
    

1
awk '{print length()}'ধীরে ধীরে শেল লুপিং এড়াতে ব্যবহার করতে পারেন .. তবে তারপরেও কেউ এটিকে নিজেই করিয়ে দিতে পারে ...
সুদীপ

@Sundeep, এটা সত্যি, ( যদি উভয় একই সময়ে শুরু করা হয়), যে awkলুপিং হয় দ্রুত শেল লুপিং করে। তবে শেলটি সর্বদা স্মৃতিতে থাকে এবং এটি awkনাও হতে পারে - যখন awkইতিমধ্যে লোড করা হয় না, বা অদলবদল হয় না তখন এটি লোড করার ওভারহেড, ( সময়টি হারিয়ে যায় ), চালনার সুবিধার চেয়ে বেশি হতে পারে awk- বিশেষত একটি ছোট ক্ষেত্রে লুপ. এই জাতীয় ক্ষেত্রে ( যেমন এই ক্ষেত্রে) ধীরawk হতে পারে ।
এজিসি

ভাল, অবশ্যই ছোট জিনিসগুলির জন্য সময় সম্পর্কে উদ্বিগ্ন নই ... দেখুন ইউনিক্স.স্ট্যাকেক্সেঞ্জার.কম
সন্দীপ

1
@Sundeep, আমি কি করতে চিন্তা করবেন না। কিছুকাল আগে আমি ফ্লপি ভিত্তিক লিনাক্স ডিস্ট্রোস ব্যবহার করতাম যা কয়েক মেগা র‌্যামে ফ্লপি বন্ধ করে দিতে পারে। অকারণে awkশেল স্ক্রিপ্ট ব্যবহার করা এই জাতীয় সিস্টেমকে সমস্ত চৌকিতে ক্রল করতে পারে। সাধারণত: একই ল্যাটেন্সি ড্রাগটি সীমিত ফার্মওয়্যারের সিস্টেমে বা ভারী বোঝার অধীনে যে কোনও সিস্টেমে প্রযোজ্য।
এজিসি

1

সংক্ষিপ্ত সমন্বয় trএবং awk:

$ tr -d ' N' <file.in | awk '{ print length }'
1
1
1
0
1
2
2

এটি ইনপুট ফাইল থেকে সমস্ত স্পেস একটি এনএস মুছে ফেলে এবং awkকেবল প্রতিটি লাইনের দৈর্ঘ্য মুদ্রণ করে।


0

আর একটি সহজ উপায় অজগর থেকে এটি করা, যা বেশিরভাগ ইউনিক্স পরিবেশে প্রাক-ইনস্টল করা হয়। একটি .py ফাইলে নিম্নলিখিত কোডটি ফেলে দিন:

with open('geno') as f:
    for line in f:
        count = 0
        for word in line.split():
            if word != 'N':
                count += 1
        print(count)

এবং তারপরে:

python file.py

আপনার টার্মিনাল থেকে। উপরেরটি যা করে তা হ'ল:

  • "জেনো" নামের একটি ফাইলের প্রতিটি লাইনের জন্য
  • 0 এ একটি কাউন্টার সেট করুন এবং প্রতিবার আমরা কোনও মান খুঁজে পাই এটি বাড়িয়ে দিন! = 'এন'
  • যখন বর্তমান লাইনের শেষটি পৌঁছে যাবে তখন কাউন্টারটি মুদ্রণ করুন এবং পরবর্তী লাইনে যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.