मैं एक फ़ाइल में सबसे लंबी लाइन की लंबाई का पता लगाने के लिए एक सरल तरीका ढूंढ रहा हूं। आदर्श रूप में, यह एक स्क्रिप्ट के बजाय एक साधारण बैश शेल कमांड होगा।
मैं एक फ़ाइल में सबसे लंबी लाइन की लंबाई का पता लगाने के लिए एक सरल तरीका ढूंढ रहा हूं। आदर्श रूप में, यह एक स्क्रिप्ट के बजाय एक साधारण बैश शेल कमांड होगा।
जवाबों:
Wc (GNU कोरुटिल्स) का उपयोग करना 7.4:
wc -L filename
देता है:
101 filename
-L
स्थानीय पर निर्भर करता है। कुछ अक्षर (बाइट में और बहुब्रीहि दोनों अर्थों में) की गिनती भी नहीं की जा सकती है!
wc: illegal option -- L usage: wc [-clmw] [file ...]
gwc
को coreutils
स्थापित करता है g
।
awk '{print length, $0}' Input_file |sort -nr|head -1
संदर्भ के लिए: किसी फ़ाइल में सबसे लंबी लाइन ढूँढना
END{}
ब्लॉक से प्रिंट करें ।
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE
awk '{ if (length($0) > max) max = length($0) } END { print max }' YOURFILE
awk 'length>max{max=length}END{print max}' file
awk '{ if (length($0) > max) {max = length($0); maxline = $0} } END { print maxline }' YOURFILE | wc -c
बस मज़ेदार और शैक्षिक उद्देश्य के लिए, शुद्ध पोसिक्स शेल समाधान , बिल्ली के बेकार उपयोग के बिना और बाहरी आदेशों के लिए कोई फोर्किंग नहीं। पहले तर्क के रूप में फ़ाइल नाम लेता है:
#!/bin/sh
MAX=0 IFS=
while read -r line; do
if [ ${#line} -gt $MAX ]; then MAX=${#line}; fi
done < "$1"
printf "$MAX\n"
< "$1"
स्टड से आसानी से पढ़ा जा सकता है। एक परीक्षण के साथ $#
यह दोनों भी कर सकता है, जो आर्ग की संख्या पर निर्भर करता है। बस इस दुनिया में बेकार बिल्लियों की कोई जरूरत नहीं है। शुरुआत से ही सही के अनुसार न्यूबिक्स सिखाई जानी चाहिए।
longest < /usr/share/dict/words
perl -ne 'print length()." line $. $_"' myfile | sort -nr | head -n 1
लंबाई, लाइन संख्या और सबसे लंबी लाइन की सामग्री प्रिंट करता है
perl -ne 'print length()." line $. $_"' myfile | sort -n
रेखा संख्या और लंबाई के साथ सभी पंक्तियों की क्रमबद्ध सूची प्रिंट करता है
.
संघटन ऑपरेटर है - यह लंबाई के बाद यहाँ उपयोग किया जाता है ()
$.
वर्तमान लाइन संख्या
$_
है जो वर्तमान लाइन है
wc -L
सबसे अच्छा समाधान है जो मैंने अब तक देखा है।
wc -L
3 सेकंड लगे
wc -L
बस संख्या रिकॉर्ड की गणना करें - यह क्यू सबसे लंबी पंक्ति को खोजने वाला था - बिल्कुल समान नहीं है, इसलिए यह सटीक तुलना नहीं है।
उपरोक्त उदाहरणों में महत्वपूर्ण अनदेखी बिंदु।
निम्नलिखित 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
लगता है सभी उत्तर सबसे लंबी लाइन की लाइन संख्या नहीं देते हैं। निम्न आदेश पंक्ति संख्या और लगभग लंबाई दे सकते हैं:
$ 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
यहाँ एवेर्स के संदर्भ दिए गए हैं
cat filename | awk '{print length, $0}'|sort -nr|head -1
बस मज़े के लिए, यहाँ Powershell संस्करण है:
cat filename.txt | sort length | select -last 1
और सिर्फ लंबाई पाने के लिए:
(cat filename.txt | sort length | select -last 1).Length
sort
तर्क के रूप में filename.txt ले सकते हैं? फिर बिल्ली बेकार है क्योंकि sort length filename.txt | select -last 1
एक पाइप और एक प्रक्रिया से बचा जाता है जो सिर्फ डेटा की प्रतिलिपि बनाता है।
मैं एक यूनिक्स वातावरण में हूं, और gzipped फ़ाइलों के साथ काम करता हूं जो आकार में कुछ जीबी हैं। मैंने 2052 की रिकॉर्ड लंबाई के साथ 2 जीबी की गज़्ड फ़ाइल का उपयोग करते हुए निम्नलिखित कमांड का परीक्षण किया।
zcat <gzipped file> | wc -L
तथा
zcat <gzipped file> | awk '{print length}' | sort -u
समय उथल-पुथल का था
117 सेकंड
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
पहले लाभ होता है जो पहले चल रहा है (और डिस्क कैश को बीज देता है)। आपको इस तर्क को स्टिक बनाने के लिए दस रन से पहले किसे बुलाया जाता है, के क्रम को यादृच्छिक बनाना होगा।
विषय पर भिन्नता।
यह एक फ़ाइल में पाई जाने वाली सबसे लंबी लाइन की लंबाई वाली सभी रेखाओं को दिखाएगा , ताकि वे स्रोत में दिखाई देने वाले क्रम को बनाए रख सकें।
FILE=myfile grep `tr -c "\n" "." < $FILE | sort | tail -1` $FILE
इसलिए मायफाइल
x
mn
xyz
123
abc
दे देंगे
xyz
123
abc
यदि आप 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
-c -l -m -w
विकल्प POSIX हैं।-L
एक GNUism है।