मैं एक निश्चित लंबाई से अधिक फ़ाइलों में लाइनों की पहचान कैसे कर सकता हूं


12

मैं अपने कोड में लाइनें ढूंढना चाहता हूं जो एक निश्चित लंबाई से अधिक हो। मेरा कोड कई फाइलों में है। ऐसा करने का एक अच्छा तरीका क्या है?

मैं फाइल और लाइन नंबर जानना चाहूंगा; सामग्री को प्राथमिकता दी जाएगी, लेकिन आवश्यक नहीं है। अभ्यास का उद्देश्य तब यह पता लगाना है कि लाइनों को कैसे तोड़ना है (शायद मैन्युअल रूप से)।


आप परिणाम कैसे चाहते हैं? लाइनों के रूप में ही (उनकी सामग्री, के रूप में grep), या लाइन नंबर के रूप में, या कुछ और के रूप में (शायद आप उन पर एक और कार्रवाई लागू करना चाहते हैं)? संभवतः ऐसा करने का सबसे अधिक निर्धारित तरीका इस बात पर निर्भर करता है कि इन पंक्तियों के साथ आगे क्या किया जाएगा।
इम्ज़ - इवान ज़खरीशेव

@ imz - इवानजखायराशेव अच्छा बिंदु। प्रश्न अपडेट किया गया।
मार्सिन

जवाबों:


13

के साथ grep:

grep -En '.{12}' file

कम से कम 12 वर्णों वाली लाइनों के लिए।

कई फाइलों के साथ:

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

grepGNU जैसे कुछ कार्यान्वयन grep, फ़ाइल-खोज स्वयं कर सकते हैं।

grep -rEn '.{12}' .

लेकिन सहानुभूति और अन्य गैर-नियमित फ़ाइलों से सावधान रहें।


मुझे यह पसंद है क्योंकि यह सरल है, और मैं इस तरह से कुछ करने की उम्मीद कर रहा था (अभी भी इसके आसपास नहीं हुआ है)।
मार्सिन

12

AWK समाधान

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

या, अधिक संक्षेप में:

awk 'length > 5' file

9
हम आपके संस्करण को छोटा कर सकते हैंawk 'length > 5'
cuonglm

Gnouc एक ब्रेस किलर है;)
Ouki

1
+1 के लिएawk 'length > 5'

3
जीएनयू awkके साथ कुछ कम सुरुचिपूर्ण लेकिन संक्षिप्तawk '/^.{6,}/'
इरुवर

3
@ 1_CR, यह POSIX है और इसे छोटा किया जा सकता है awk '/.{6}/'(वास्तव में GNU तब तक जागता है, जब तक कि हाल ही में एक ऐसा काम हुआ करता था जब तक कि आप तब तक काम नहीं करेंगे जब तक कि आप इसके वातावरण में POSIXLY_CORRECT पास नहीं कर लेते)।
स्टीफन चेजलस

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 से घटाकर न्यूलाइन शामिल नहीं है $len; यदि यह वांछनीय नहीं है, या आपका इनपुट CRLF समाप्ति का उपयोग करता है, तो आपको तदनुसार समायोजित करना चाहिए।


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आपकी लाइनों में लाइन ब्रेक की गिनती करेगा।
कोउंगलम

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[@]}"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.