किसी विशिष्ट वर्ण को छोड़कर, वर्णों की संख्या को एक पंक्ति में कैसे गिना जाए?


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

प्रत्येक पंक्ति में मैं उन सभी वर्णों की कुल संख्या गिनना चाहता हूं जो "एन" नहीं हैं

मेरी इच्छा उत्पादन

1
1
1
0
1
2
2

उस sedसामान को बदलने के लिए उपयोग करें जिसके बारे में आप परवाह नहीं करते हैं और awkशेष लंबाई की गणना करने के लिएsed 's/N//g ; s/\s//g' file | awk '{ print length($0); }'
रॉल्फ

जवाबों:


13

GNU awk समाधान:

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
    • regex समकक्ष होगा grep {!/^N$/} @F
  • उपयोग scalarसरणी के तत्वों की संख्या देगा

6

वैकल्पिक awk समाधान:

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
@ संदीप हां, यह सही है। मेरे अपडेट को भी देखें जहां लाइनों में केवल 0 के रूप में इंगित करने के लिए टैब्स या स्पेस शामिल हैं
αнsнιη

5
  1. trऔर POSIX शेल स्क्रिप्ट:

    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()}'धीमी खोल से बचने के लिए उपयोग कर सकते हैं .. लेकिन फिर एक ही awk के साथ यह सब कर सकता है ...
Sundeep

@Sundeep, यह सच है, ( यदि दोनों एक ही समय में शुरू कर रहे हैं), कि awkपाशन है तेजी से खोल पाशन से। लेकिन शेल हमेशा स्मृति में होता है, और awkहो सकता है - जब awkपहले से लोड नहीं किया जाता है, या बाहर स्वैप किया जाता है, तो इसे लोड करने का ओवरहेड, ( समय खो गया ), चलाने के लाभ से अधिक हो सकता है awk- विशेष रूप से एक छोटे से पर पाश। ऐसे मामलों में, ( अर्थात यह मामला), धीमाawk हो सकता है ।
13

ठीक है, मैं निश्चित रूप से छोटे सामान के लिए समय के बारे में चिंतित नहीं हूं
Sundeep

1
@ संदीप, मैं चिंता करता हूं । कुछ समय पहले मैं फ्लॉपी आधारित लिनक्स डिस्ट्रोस का उपयोग करता था , जो कि फ्लॉपी को बंद कर सकता था, राम के कुछ megs में। अनावश्यक रूप से 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 पर सेट करें और हर बार जब हम मान पाते हैं तो इसे बढ़ाएँ! = 'N'
  • जब वर्तमान रेखा का अंत हो जाता है, तो काउंटर को प्रिंट करें और अगली पंक्ति पर जाएं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.