किसी फाइल में सबसे लंबी लाइन


198

मैं एक फ़ाइल में सबसे लंबी लाइन की लंबाई का पता लगाने के लिए एक सरल तरीका ढूंढ रहा हूं। आदर्श रूप में, यह एक स्क्रिप्ट के बजाय एक साधारण बैश शेल कमांड होगा।

जवाबों:


270

Wc (GNU कोरुटिल्स) का उपयोग करना 7.4:

wc -L filename

देता है:

101 filename

56
ध्यान दें कि केवल -c -l -m -wविकल्प POSIX हैं। -Lएक GNUism है।
जेन्स

4
यह भी ध्यान दें कि परिणाम -Lस्थानीय पर निर्भर करता है। कुछ अक्षर (बाइट में और बहुब्रीहि दोनों अर्थों में) की गिनती भी नहीं की जा सकती है!
वाल्टर ट्रॉस

7
OS X:wc: illegal option -- L usage: wc [-clmw] [file ...]
ह्यूगो

12
OS X: होमब्रे का उपयोग करते हुए, GNU के लिए gwc का उपयोग करें शब्द गणना gw -L फ़ाइल नाम
kaycoder

3
@xaxxon सूत्र में है, जो सभी उपसर्ग के साथ GNU कोरुटिल्स gwcको coreutilsस्थापित करता है g
15:13 बजे gsnedders

100
awk '{print length, $0}' Input_file |sort -nr|head -1

संदर्भ के लिए: किसी फ़ाइल में सबसे लंबी लाइन ढूँढना


12
अतिरिक्त बिल्ली कमान क्यों? बस फ़ाइल नाम को सीधे तर्क के रूप में दें।
थॉमस पैडरॉन-मैक्कार्थी

18
@Thomas। एक विकल्प के रूप में किसी फ़ाइल को निर्दिष्ट करने की तुलना में इसे पाइप के रूप में व्यक्त करना सामान्य है। मेरे मामले में, मैं डेटाबेस क्वेरी से आउटपुट आउटपुट का उपयोग करूंगा।
एंड्रयू प्रॉक

1
यह सबसे अच्छा जवाब है क्योंकि यह अधिक पोसिक्स है (ठीक है, ओएस एक्स पर काम करता है)
एमके।

5
@MK। हालाँकि, यह दृष्टिकोण लाइनों की संख्या में O (n * log (n)) है, जबकि रेमन का दृष्टिकोण O (n) है।
19

2
बड़ी फ़ाइल को सॉर्ट करने में गीगाबाइट को पूरा करने और उपभोग करने में घंटों लग सकते हैं, यहां तक ​​कि टेबैप स्पेस भी इनपुट फ़ाइल के आकार के आधार पर। सबसे लंबी लंबाई और उससे जुड़े रिकॉर्ड को संग्रहीत करने पर विचार करें, फिर इसे एक END{}ब्लॉक से प्रिंट करें ।
Luv2code

67
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }'  YOURFILE 

3
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
ke20

5
awk 'length>max{max=length}END{print max}' file
क्रिस सेमुर

8
यह उत्तर इसकी लंबाई के बजाय फ़ाइल में सबसे लंबी पंक्ति का पाठ देता है । मैं इसे छोड़ रहा हूं-हालांकि यह सवाल लंबाई के लिए पूछता है क्योंकि मुझे संदेह है कि यह उन लोगों के लिए उपयोगी होगा जो इस पृष्ठ पर सिर्फ शीर्षक देख रहे हैं।
रेमन

3
डब्ल्यूसी का उपयोग करके गिनती प्राप्त करना आसान है ..awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
निक

1
क्या आप कृपया स्पष्टीकरण देंगे कि यह कैसे काम करता है?
लनक्स

23

बस मज़ेदार और शैक्षिक उद्देश्य के लिए, शुद्ध पोसिक्स शेल समाधान , बिल्ली के बेकार उपयोग के बिना और बाहरी आदेशों के लिए कोई फोर्किंग नहीं। पहले तर्क के रूप में फ़ाइल नाम लेता है:

#!/bin/sh

MAX=0 IFS=
while read -r line; do
  if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"

6
(बिल्ली के माध्यम से) में std से पढ़ने में सक्षम नहीं होना वास्तव में इस की उपयोगिता को कम करता है, इसे बढ़ाता नहीं है।
एंड्रयू प्रोक

4
ठीक है, ओपी ने स्पष्ट रूप से "फ़ाइल" कहा और इसके बिना < "$1"स्टड से आसानी से पढ़ा जा सकता है। एक परीक्षण के साथ $#यह दोनों भी कर सकता है, जो आर्ग की संख्या पर निर्भर करता है। बस इस दुनिया में बेकार बिल्लियों की कोई जरूरत नहीं है। शुरुआत से ही सही के अनुसार न्यूबिक्स सिखाई जानी चाहिए।
जेन्स

7
इसे उच्च दर्जा दिया जाना चाहिए, यह वही है जो उपयोगकर्ता ने मांगा था। फ़ंक्शन को सबसे लंबे समय तक जोड़ें () {MAX = 0 IFS = पढ़े -r लाइन के दौरान; अगर [$ {# लाइन} -gt $ MAX]; तब MAX = $ {# लाइन}; Fi ने अपने .bashrc में $ MAX} प्रतिध्वनित किया और आप चला सकते हैंlongest < /usr/share/dict/words
skierpage

13
wc -L < filename

देता है

101

1
धन्यवाद, मैं wcफ़ाइल नाम आउटपुट से रोकने के लिए एक रास्ता तलाश रहा हूँ :)
पीटर।

11
perl -ne 'print length()."  line $.  $_"' myfile | sort -nr | head -n 1

लंबाई, लाइन संख्या और सबसे लंबी लाइन की सामग्री प्रिंट करता है

perl -ne 'print length()."  line $.  $_"' myfile | sort -n

रेखा संख्या और लंबाई के साथ सभी पंक्तियों की क्रमबद्ध सूची प्रिंट करता है

.संघटन ऑपरेटर है - यह लंबाई के बाद यहाँ उपयोग किया जाता है ()
$.वर्तमान लाइन संख्या
$_है जो वर्तमान लाइन है


फ़ाइल को सॉर्ट करने की आवश्यकता है .. प्रदर्शन मध्यम आकार की फ़ाइलों के लिए भी भयानक होगा और बड़ी फ़ाइलों के लिए काम नहीं करेगा। wc -Lसबसे अच्छा समाधान है जो मैंने अब तक देखा है।
तगार

स्रोत (ब्रिटिश नेशनल कॉर्पस) के रूप में एक 550MB 6,000,000 लाइन टेक्स्ट फ़ाइल का उपयोग करते हुए, पर्ल समाधान को 12 सेकंड लगे, जबकि wc -L3 सेकंड लगे
क्रिस कोकनेट

wc -Lबस संख्या रिकॉर्ड की गणना करें - यह क्यू सबसे लंबी पंक्ति को खोजने वाला था - बिल्कुल समान नहीं है, इसलिए यह सटीक तुलना नहीं है।
तगारग

6

उपरोक्त उदाहरणों में महत्वपूर्ण अनदेखी बिंदु।

निम्नलिखित 2 उदाहरण विस्तारित टैब की गिनती करते हैं

  wc -L  <"${SourceFile}" 
# or
  expand --tabs=8 "${SourceFile}" | awk '{ if (length($0) > max) {max = length($0)} } END { print max }'

निम्नलिखित 2 गैर-विस्तारित टैब की गणना करते हैं।

  expand --tabs=1 "${SourceFile}" | wc -L 
# or
  awk '{ if (length($0) > max) {max = length($0)} } END { print max }' "${SourceFile}"

इसलिए

              Expanded    nonexpanded
$'nn\tnn'       10            5

5

लगता है सभी उत्तर सबसे लंबी लाइन की लाइन संख्या नहीं देते हैं। निम्न आदेश पंक्ति संख्या और लगभग लंबाई दे सकते हैं:

$ cat -n test.txt | awk '{print "longest_line_number: " $1 " length_with_line_number: " length}' | sort -k4 -nr | head -3
longest_line_number: 3 length_with_line_number: 13
longest_line_number: 4 length_with_line_number: 12
longest_line_number: 2 length_with_line_number: 11

हम वहाँ चलें। यह मेरी अप्रिय लंबी टिप्पणी पाता है। धन्यवाद दोस्त।
फिलिप

आप इसे एक कदम आगे ले जा सकते हैं और बिल्ली को खत्म कर सकते हैं। awk '{print length}' test.txt | sort -rn | head -1। यदि आपको वास्तविक लाइन की सामग्री भी चाहिए, तो awk '{print length,$0}' test.txt | sort -k1 -rn| head -1
काकोमा

3

पर्ल में:

perl -ne 'print ($l = $_) if (length > length($l));' filename | tail -1

यह केवल रेखा प्रिंट करता है, इसकी लंबाई भी नहीं।


3

यहाँ एवेर्स के संदर्भ दिए गए हैं

cat filename | awk '{print length, $0}'|sort -nr|head -1

http://wtanaka.com/node/7719


1
वह दूसरी awk स्क्रिप्ट आपको केवल सबसे लंबी लंबाई बताएगी, सबसे लंबी लाइन नहीं दिखाएगी।
आरपी

1
आइए..ये संदर्भों के साथ जोड़े गए पहले दो उत्तरों के समान हैं।
पाले ब्लू डॉट

@ आरएसपी: मैं दूसरे
एवर को मारता हूं

2

बस मज़े के लिए, यहाँ Powershell संस्करण है:

cat filename.txt | sort length | select -last 1

और सिर्फ लंबाई पाने के लिए:

(cat filename.txt | sort length | select -last 1).Length

4
तो भी शक्तियां प्रोग्रामर बेकार बिल्लियों का उपयोग करना चाहिए?
जेन्स

1
@ जेंस यकीन नहीं है कि मैं आपको समझता हूं, पॉवर्सशेल में कैट गेट-कंटेंट के लिए सिर्फ एक उपनाम है, जिसका व्यवहार संदर्भ और प्रदाता पर निर्भर करता है।
eddiegroves

sortतर्क के रूप में filename.txt ले सकते हैं? फिर बिल्ली बेकार है क्योंकि sort length filename.txt | select -last 1एक पाइप और एक प्रक्रिया से बचा जाता है जो सिर्फ डेटा की प्रतिलिपि बनाता है।
जैन

एक विचार के रूप में वास्तव में क्या शक्तियां है? मुझे लगा कि विंडोज़ मशीनों के लिए पावरशेल यूटिलिटी का उपयोग किया गया था?
फ्रैंकलिन

4
@ जैन, डेटा अक्सर फ़ाइल नाम के बजाय एक स्ट्रीम से आता है। यह एक मानक यूनिक्स उपकरण मुहावरा है।
एंड्रयू प्रोक

2

मैं एक यूनिक्स वातावरण में हूं, और gzipped फ़ाइलों के साथ काम करता हूं जो आकार में कुछ जीबी हैं। मैंने 2052 की रिकॉर्ड लंबाई के साथ 2 जीबी की गज़्ड फ़ाइल का उपयोग करते हुए निम्नलिखित कमांड का परीक्षण किया।

  1. zcat <gzipped file> | wc -L

तथा

  1. zcat <gzipped file> | awk '{print length}' | sort -u

समय उथल-पुथल का था

  1. 117 सेकंड

  2. 109 सेकंड

यहां लगभग 10 रन के बाद मेरी स्क्रिप्ट है।

START=$(date +%s) ## time of start

zcat $1 |  wc -L

END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

START=$(date +%s) ## time of start

zcat $1 |  awk '{print length}' | sort -u

END=$(date +%s) ## time of end
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

मुझे यकीन नहीं है कि यह एक वैध तुलना है, मुझे चिंता होगी कि awkसंस्करण के डिस्क ब्लॉक कैशिंग से सबसे wcपहले लाभ होता है जो पहले चल रहा है (और डिस्क कैश को बीज देता है)। आपको इस तर्क को स्टिक बनाने के लिए दस रन से पहले किसे बुलाया जाता है, के क्रम को यादृच्छिक बनाना होगा।
कैनन क्रिस

1

विषय पर भिन्नता।

यह एक फ़ाइल में पाई जाने वाली सबसे लंबी लाइन की लंबाई वाली सभी रेखाओं को दिखाएगा , ताकि वे स्रोत में दिखाई देने वाले क्रम को बनाए रख सकें।

FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE

इसलिए मायफाइल

x
mn
xyz
123
abc

दे देंगे

xyz
123
abc

0

यदि आप MacOS का उपयोग कर रहे हैं और wc: illegal option -- Lआपको यह त्रुटि मिल रही है: तो आपको GNU को स्थापित करने की आवश्यकता नहीं है।

यदि आप बस इतना करना चाहते हैं कि फ़ाइल की सबसे लंबी पंक्ति में वर्णों की गिनती प्राप्त करें और आप OS X रन का उपयोग कर रहे हैं:

awk '{print length}' "$file_name" | sort -rn | head -1

कुछ इस तरह;

echo "The longest line in the file $file_name has $(awk '{print length}' "$file_name" | sort -rn | head -1) characters"

आउटपुट:

The longest line in the file my_file has 117 characters

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