बस bash में wc से पूर्णांक प्राप्त करें


115

क्या पूर्णांक प्राप्त करने का एक तरीका है जो bash में wc रिटर्न देता है?

मूल रूप से मैं फ़ाइल नाम के बाद स्क्रीन पर लाइन नंबर और शब्द काउंट लिखना चाहता हूं।

output: filename linecount wordcount यह है, जो कि अभी तक मेरे पास है:

files=`ls`
for f in $files;
do
        if [ ! -d $f ] #only print out information about files !directories
        then
                # some way of getting the wc integers into shell variables and then printing them
                echo "$f $lines $ words"
        fi
done

जवाबों:


57

आप cutकमांड का उपयोग केवल पहले शब्द का wcआउटपुट पाने के लिए कर सकते हैं (जो लाइन या शब्द गणना है):

lines=`wc -l $f | cut -f1 -d' '`
words=`wc -w $f | cut -f1 -d' '`

5
एक ही फ़ाइल के लिए दो बार wc चलाना अक्षम है।
गावी

3
यह सच है, इसलिए मुझे लगता है कि जेम्स ब्रॉडहेड का जवाब ज्यादा बेहतर है। मैं cutपूर्ण उत्पादन पर काम नहीं कर सका wc $fक्योंकि खेतों के बीच रिक्त स्थान की संख्या भिन्न होती है।
कैसाब्लांका

1
@ कैसब्लांका आप 'tr -s' का उपयोग करके रिक्त स्थान की संख्या को निचोड़ सकते हैं। मैंने अपने उत्तर में इस प्रश्न के अधिक पोर्टेबल समाधान सूचीबद्ध किए हैं।
रूबल

के बाद से इस सवाल का जवाब में हम एक चर करने के लिए बताए रहे हैं, हम साथ रिक्त स्थान को मार सकता है
cycollins

88

सबसे सरल जवाब कभी:

wc < filename 

5
लेकिन वांछित उत्पादन नहीं करता है।
डेव न्यूटन

यकीन है कि यह करता है, आप बस उचित मापदंडों में गुजरते हैं जो आप वैसे भी करेंगे। उदाहरण के लिए, यदि आप ऐसा करते हैं wc -c < file name, तो यह आपको केवल बाइट्स के पूर्णांक संख्या और कुछ नहीं देगा।
केलेनाईल

13
मेरा कहना यह था कि यदि आप (१.५ वर्ष पुराने) प्रश्न का उत्तर देने जा रहे हैं, तो सभी जानकारी को उत्तर में डाल सकते हैं, यह सब है :)
डेव न्यूटन

whoops, बस सवाल फिर से पढ़ें .. # फेल, मैं शोध कर रहा था कि कैसे सिर्फ पूर्णांक प्राप्त करने के लिए , और मैं एक उत्तर से जानकारी का उपयोग कर रहा था, जब मैंने एक बेहतर उत्तर की खोज की, और फिर इसके बारे में पोस्ट करने का फैसला किया। क्षमा करें ..
BananaNeil

3
आपने Google को जवाब दिया, यही मायने रखता है। :-)
सिरो सेंटिल्ली 郝海东 冠状 ill ill 法轮功 ''

82

बस:

wc -l < file_name

नौकरी करेंगे। लेकिन इस आउटपुट में wcसंख्या के दाएं-संरेखित के रूप में पूर्वनिर्मित व्हाट्सएप शामिल है ।


3
व्हॉट्सएप के बिना बस लाइन की गिनती प्राप्त करने के लिए: wc -l < foo.txt | xargsRef - stackoverflow.com/a/12973694/149428
टेलर एड्मिस्टन

1
इसलिए, जबकि कमांड प्रमुख स्थानों के साथ एक उत्तर का उत्पादन करता है, प्रश्नकर्ता एक चर को असाइन कर रहा था और जो प्रमुख रिक्त स्थान को स्वचालित रूप से छोड़ देता है (कम से कम पुराने OSX बैश पर मेरा अनुभव था)। दूसरे शब्दों में, lines=`wc -l < $f`एक चर "लाइन" में परिणाम जिसके मूल्य में कोई अग्रणी स्थान नहीं है।
चक्रवात

क्या होगा अगर मैं खोजने के साथ पाइप कर रहा हूं? मुझे एक त्रुटि मिलती है: find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -lठीक काम करता है लेकिन हर फाइल को प्रिंट करता है। यदि मैं उपयोग करता find . -path -prune -o -name "*.swift" -print0 | xargs -0 wc -l <हूं तो मुझे एक त्रुटि मिलती है। parse error near '\n'
नूनो गोंकोलेव्स

55
wc $file | awk {'print "$4" "$2" "$1"'}

अपने लेआउट के लिए आवश्यक रूप से समायोजित करें।

यह नकारात्मक ("एक निर्देशिका नहीं") पर सकारात्मक तर्क ("एक फ़ाइल") का उपयोग करने के लिए भी अच्छा है

[ -f $file ] && wc $file | awk {'print "$4" "$2" "$1"'}

1
Cmder में मेरी विंडोज पर (4.4.12 bash) यह काम करता है: wc $file | awk '{print $4" "$2" "$1}'- के बाहर apostrophes {}
ग्रेजेगोर जीरेलिक

36

कभी-कभी wc विभिन्न प्लेटफार्मों में विभिन्न प्रारूपों में आउटपुट देता है। उदाहरण के लिए:

OS X में:

$ echo aa | wc -l

         1

सेंटोस में:

$ echo aa | wc -l

1

तो केवल कट का उपयोग करने से संख्या पुनः प्राप्त नहीं हो सकती है। इसके बजाय अंतरिक्ष वर्णों को हटाने के लिए ट्राय करें:

$ echo aa | wc -l | tr -d ' '

23

स्वीकृत / लोकप्रिय उत्तर OSX पर काम नहीं करते हैं।

निम्न में से कोई भी bsd और linux पर पोर्टेबल होना चाहिए।

wc -l < "$f" | tr -d ' '

या

wc -l "$f" | tr -s ' ' | cut -d ' ' -f 2

या

wc -l "$f" | awk '{print $1}'

11

यदि आप फ़ाइल नाम को पुनर्निर्देशित करते हैं wc तो आउटपुट पर फ़ाइल नाम छोड़ देता है।

दे घुमा के:

read lines words characters <<< $(wc < filename)

या

read lines words characters <<EOF
$(wc < filename)
EOF

forके उत्पादन पर पुनरावृति का उपयोग करने के बजाय ls, यह करें:

for f in *

अगर वहाँ फ़ाइल नाम है कि रिक्त स्थान शामिल हैं काम करेंगे।

यदि आप ग्लोबिंग का उपयोग नहीं कर सकते हैं, तो आपको एक while readलूप में पाइप करना चाहिए :

find ... | while read -r f

या प्रक्रिया प्रतिस्थापन का उपयोग करें

while read -r f
do
    something
done < <(find ...)

मैंने आपको वैसे भी उखाड़ फेंका, लेकिन आपको फ़ाइल नाम को पुनर्निर्देशित करने की आवश्यकता नहीं है। बस इसे एक अतिरिक्त फ़ील्ड के रूप में कैप्चर करें। read lines words characters filename <<< $(wc "$f")ओह, और यदि आपने रिक्त स्थान के खिलाफ सख्त होने के लिए * का उपयोग किया है, तो आप इसका उपयोग करते समय var को दोगुना करना चाहते हैं।
ब्रूनो ब्रोंस्की

एक अतिरिक्त चर का उपयोग करना वास्तव में इसे करने का एक और तरीका है, लेकिन यदि आप चर का उपयोग नहीं करने जा रहे हैं (शायद आपके पास पहले से ही चर में फ़ाइल नाम है - $fइस मामले में), यह अनावश्यक है। साथ ही, ओपी ने केवल पूर्णांक प्राप्त करने का तरीका पूछा । आप एक चर को उद्धृत करने के बारे में सही हैं, लेकिन मैंने चर का उपयोग नहीं दिखाया, इसलिए मैंने उस बिंदु का उल्लेख करना छोड़ दिया। for f in *प्रपत्र लगभग हमेशा के बजाय उत्पादन का उपयोग करने का इस्तेमाल किया जाना चाहिए ls, जैसा कि आप जानते।
अगली सूचना तक रोक दिया गया।

मैं lsबिंदु पर पूरी तरह से सहमत हूं । यह आपको एक पुरस्कार मिलेगा। partmaps.org/era/unix/award.html#ls
ब्रूनो ब्रोंस्की

यदि आप फ़ाइल नाम नहीं चाहते हैं, तो आप ऐसा कर सकते हैं:read lines words characters _ <<< $(wc "$f")

@EvanTeitelman: जैसा कि आपके ऊपर टिप्पणियों के एक जोड़े में चर्चा की गई है। $_बस एक अलग चर है।
अगली सूचना तक रोक दिया गया।

3

यदि फ़ाइल छोटी है, तो आप wcदो बार कॉल कर सकते हैं , और निम्न की तरह कुछ का उपयोग कर सकते हैं , जो एक अतिरिक्त प्रक्रिया में पाइपिंग से बचता है:

lines=$((`wc -l "$f"`))
words=$((`wc -w "$f"`))

$((...))है अंकगणित विस्तार बैश की। यह आउटपुट के किसी भी व्हाट्सएप को हटा देता हैwc इस मामले ।

यह समाधान अधिक समझ में आता है यदि आपको या तो linecount या wordcount की आवश्यकता है।


2

कैसे के साथ sed?

wc -l /path/to/file.ext | sed 's/ *\([0-9]* \).*/\1/'


1

इस संख्यात्मक परिणाम के लिए प्रयास करें:
nlines = $ (wc -l <$ myfile)


0

इसे इस्तेमाल करे:

wc `ls` | awk '{ LINE += $1; WC += $2 } END { print "lines: " LINE  " words: " WC }'

यह एक पंक्ति गणना, और शब्द गणना (LINE और WC) बनाता है, और उन्हें wc से निकाले गए मानों के साथ बढ़ाता है (पहले कॉलम के मूल्य के लिए $ 1 और दूसरे के लिए $ 2 का उपयोग करता है) और अंत में परिणामों को प्रिंट करता है।


0

"मूल रूप से मैं फ़ाइल नाम के बाद स्क्रीन पर लाइन नंबर और शब्द काउंट लिखना चाहता हूं।"

answer=(`wc $f`)
echo -e"${answer[3]}
lines:  ${answer[0]}
words:  ${answer[1]}
bytes:  ${answer[2]}"

आउटपुट: myfile.txt लाइनें: 10 शब्द: 20 बाइट्स: 120


0
files=`ls`
echo "$files" | wc -l | perl -pe "s#^\s+##"

यदि आप perlवैसे भी उपयोग कर रहे हैं , तो शायद शब्द पर्ल में भी गिना जा सकता है। एक और अधिक आर्थिक दृष्टिकोण होगाtr -d '[:space:]'
ट्रिपल ट्रिपल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.