फाइल से सबसे लंबी लाइन कैसे प्राप्त करें?


10

मुझे एक फाइल से सबसे लंबी लाइन की लाइन संख्या का पता लगाने में दिलचस्पी है।

उदाहरण के लिए, यदि मेरे पास निम्नलिखित सामग्री वाली फाइल है:

lalala
tatatata
abracadabra
mu mu mu

मैं कैसे एक bash स्क्रिप्ट लिख सकता हूँ जो मुझे कुछ इस तरह आउटपुट देगा 3 -> abracadabra:?

जवाबों:


9

आपको ऐसा करने के लिए स्क्रिप्ट की आवश्यकता नहीं है। एक साधारण आदेश पर्याप्त है:

egrep -n "^.{$(wc -L < filename)}$" filename

यह तब भी काम करेगा जब आपके पास एक ही अधिकतम लंबाई वाली दो या अधिक लाइनें होंगी।

यदि आप चाहते हैं कि आउटपुट इस रूप में ठीक हो 3 -> abracadabra:

egrep -n "^.{$(wc -L < filename)}$" filename | sed 's/:/ -> /'

संदर्भ:


3
@ don.joey: यह यूनिक्स की शक्ति है। सरल कमांड, जो एक साथ काम कर सकते हैं। यहाँ, वह "^। {n} $", अर्थात किसी भी लाइन की खोज करता है, जो कि लाइन की शुरुआत ( ^) और उसके अंत ( $) के बीच बिल्कुल n अक्षर ( .{n}) है। फिर उसे सिर्फ n खोजने की आवश्यकता है: इसके लिए वह एक GNU-ism, "wc -L filename" (ध्यान दें कि यह पॉज़िक्स नहीं है) का उपयोग करता है जो फ़ाइल नाम की सबसे लंबी रेखा की लंबाई लौटाता है। इसलिए वह किसी भी रेखा को पकड़ लेता है जिसकी लंबाई सबसे लंबी होती है। $(cmd)के आउटपुट द्वारा प्रतिस्थापित किया जाता है cmd
ओलिवियर दुलक

1
@OlivierDulac महान टिप्पणी।
राडू रियडेनु

इससे भी बेहतर, आप -C 3संदर्भ के लिए कुछ लाइनों को पाने से पहले और बाद में grep विकल्पों में जोड़ सकते हैं (जैसे)
ShadSterling

8

आप awkप्रत्येक पंक्ति की लंबाई ( length()) और पंक्ति संख्या ( NR) को प्रिंट करने के लिए उपयोग कर सकते हैं , फिर रिवर्स ( -r) sortसंख्या द्वारा परिणाम ( -n):

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt
10 3 abracadabr
8 4 mu mu mu
7 2 tatatat
6 1 lalala

केवल पहली पंक्ति दिखाने के लिए:

$ awk '{ print length(), NR, $0 | "sort -rn" }' tmp.txt | head -n 1
10 3 abracadabr

@ user214965 कृपया मेरा अपडेट देखें, प्रदर्शित लाइन नंबर परिणाम में दूसरा नंबर है।
अत्तिला ओ।

क्या होगा अगर एक ही अधिकतम लंबाई के साथ 2 लाइनें हों?
रादु राईडेनु

@ RaduRădeanu अच्छी बात है। +1 के लिए wc -L, मुझे उस तर्क के बारे में पता नहीं था। यह वास्तव में बहुत उपयोगी है।
एटिला ओ।

4

AO (N) को एक पर्ल वन लाइनर के साथ प्राप्त किया जा सकता है:

perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'

usages (जहां machin एक फ़ाइल नाम है)

cat machin | perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max'

या

perl -e 'while (<>) { if (length > length $max) { $max=$_}}; print $max' machin

या (कम स्पष्ट लेकिन कम)

perl -ne 'if(length>length$m){$m=$_};END{print$m}' machin

बहुत, बहुत अधिक कुशल। धन्यवाद! ढूंढ रहा था।
टेस्ट 30

1
विशाल फाइलों के साथ काम करता है +1
h3xStream

0

O (n) मशीनों के लिए, उदाहरण के लिए OpenWRT, जहाँ perl उपलब्ध नहीं है, @ awk @ संस्करण उपयोगी हो सकता है।

awk 'length > l {l=length;line=$0} END {print line}' FILE

या अजगर:

python -c "print max(open('$file', 'r'), key=len)"

0

राडू का जवाब पूरी तरह से पर्याप्त और पसंद किया जाता है, हालांकि यदि आप अधिक स्पष्ट और शेल-आधारित समाधान चाहते हैं, तो आप निम्नलिखित स्क्रिप्ट का उपयोग कर सकते हैं:

#!/bin/bash
longest_length=0
longest_string=0
while IFS= read -r line || [ -n "${line}"]
do
    if [ "${#line}" -gt "${longest_length}" ]
    then
        longest_length="${#line}"
        longest_string="$line"
    fi
done < "$1"

echo "${longest_string}"

उपयोग: ./find_longest.sh input.txt

उदाहरण:

$ cat input.txt                                                          
1 2 
2 3 a a a a
4 5 6 
1 1 1 5

$ ./find_longest.sh input.txt                                            
2 3 a a a a
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.