मुझे किसी विशेष कॉलम में शब्दों की वर्ण गणना कैसे मिल सकती है?


12

मेरे पास इस तरह एक CSV फ़ाइल है:

abd,123,egypt,78
cde,456,england,45

मैं केवल 3 कॉलम शब्दों की वर्ण गणना कैसे प्राप्त कर सकता हूं?

मैं यह पता नहीं लगा सकता कि यह कैसे wcकरना है।

जवाबों:


23
cut -d, -f3 | tr -d '\n' | wc -m

(याद रखें कि wc -cबाइट्स मायने रखता है, वर्ण नहीं:

$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -c
7
$ echo a,1,españa,2 | cut -d, -f3 | tr -d '\n' | wc -m
6

)


लेकिन वह निर्दिष्ट करता है 'मैं wcआउटपुट प्राप्त करने के लिए कमांड का उपयोग करने में सक्षम नहीं हूं !'
मिकसेर

3
@mikeserv, जिसकी मैं व्याख्या करता हूंwc क्योंकि मुझे चरित्र की गिनती देने में सक्षम नहीं किया गया था , यही कारण है कि मैं दिखाता हूं कि wcइस संदर्भ में कैसे उपयोग किया जाए।
स्टीफन चेज़लस

ओह .... यह एक बहुत ही मान्य व्याख्या है जो कभी भी मेरे साथ नहीं हुई ...
mikeserv

22
awk -F, '{sum+=length($3)}; END {print +sum}' file

3
तथास्तु; awkस्तंभ आधारित फ़ाइलों को संसाधित करने के लिए डिज़ाइन किया गया था, लाइन-बाय-लाइन। उपकरण के लिए समस्या पूरी तरह से अनुकूल है।
रे

{In + print + sum} का उद्देश्य क्या है? {प्रिंट योग} के रूप में अच्छी तरह से काम करता है।
spuder

3
@spuder, कि 0इनपुट फाइल खाली होने पर खाली लाइन के बजाय प्रिंट करना है।
स्टीफन चेज़लस

2
@ दूसरी ओर, कार्य को 3 बुनियादी उपयोगिताओं (उनमें से प्रत्येक के आकार का एक अंश होने के कारण awk) को प्राप्त किया जा सकता है, जो कि विशिष्ट यूनिक्स स्पिरिट में केस को सहयोग करते हुए (समवर्ती रूप से) काम कर रहा है। आप यह देख सकते हैं कि कैसे कट + tr + wc एक के रूप में तेजी से 5 प्रकार के रूप में यह एक के रूप में 5 बार के रूप में तेजी से perlएक ही है। (कम से कम मेरे सिस्टम पर, UTF8 लोकेल में, 100MB फ़ाइल पर कोशिश की गई)।
स्टीफन चेजेलस

5

एक perlसमाधान:

perl -Mopen=:locale -F, -anle '$sum += length($F[2]); END{print $sum}' file

या एक छोटा संस्करण:

perl -Mopen=:locale -F, -anle '$sum += length($F[2])}{print $sum' file

ध्यान दें कि यह एक बाइट काउंट लौटाता है, जरूरी नहीं कि कैरेक्टर काउंट।
स्टीफन चेजलस

@StephaneChazelas: लंबाई () लॉजिकल कैरेक्टर काउंट लौटाते हैं, न कि भौतिक बाइट्स प्रति-परलोक के अनुसार।
cuonglm

लेकिन आप की जरूरत -Mopen=:localeके लिए perlउपयोगकर्ता / प्रणाली की क्या एक चरित्र है की परिभाषा का उपयोग करने, अन्यथा यह मान लिया गया वर्ण बाइट्स हैं। a,1,españa,2UTF-8 लोकेल में इनपुट पर प्रयास करें (अधिकांश सिस्टम पर डिफ़ॉल्ट)।
स्टीफन चेजेलस

@StephaneChazelas: ओह, मेरे जवाब को अपडेट किया। अच्छी बात के लिए धन्यवाद!
cuonglm

3
cut -d, -f3 <<\DATA | grep -o . | grep -c .
abd,123,egypt,78
cde,456,england,45
DATA

#OUTPUT
12

3

आप भी इस्तेमाल कर सकते हैं

awk -F, '{printf "%s", $3}' file | wc -m


1

अपनी नमूना फ़ाइल के साथ ऐसा करें:

$ cat sample.txt 
abd,123,egypt,78
cde,456,england,45

$ awk -F, '{print $3}' sample.txt | while read i; do echo "$i" | \
    tr -d '\n' | wc -m; done
5
7

wcप्रत्येक पंक्ति की गिनती प्राप्त करने के लिए काम करना मुश्किल हो सकता है। आपको इसे कॉलम 3 से प्रत्येक स्ट्रिंग के लिए व्यक्तिगत रूप से कॉल करना होगा जो कि आप जो चाहते हैं उसे करने के लिए थोड़ा मुश्किल हो जाता है। आपको अपने CSV की प्रत्येक पंक्ति को देखना होगा, कॉलम 3 को निकालना होगा और फिर wcचरित्र की गिनती प्राप्त करने के लिए इसे प्रस्तुत करना होगा ।


0

का उपयोग कर sedऔरawk

sed 's/.*,.*,\(.*\),.*/\1/g' file | awk -v FS="" '{print NF;}'

उदाहरण:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | sed 's/.*,.*,\(.*\),.*/\1/g' | awk -v FS="" '{print NF;}'
5
7

दो जाग के

awk -F, '{print $3}' file | awk -v FS="" '{print NF;}'

उदाहरण:

$ (echo abd,123,egypt,78; echo cde,456,england,45;) | awk -F, '{print $3}'| awk -v FS="" '{print NF;}'
5
7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.