2011-12-25 11 views
48

में स्तंभों की गिनती इस (अर्थात stores.dat फ़ाइल) की तरह डेटा के साथ एक फ़ाइल को देखते हुएयूनिक्स - फ़ाइल

sid|storeNo|latitude|longitude 
2|1|-28.03720000|153.42921670 
9|2|-33.85090000|151.03274200 

क्या उत्पादन के लिए एक आदेश स्तंभ नाम की संख्या हो सकता है?

उदाहरण में

यानी ऊपर यह 4. (पाइप वर्ण +1 पहली पंक्ति में की संख्या) होगा

मैं की तरह कुछ सोच रहा था:

awk '{ FS = "|" } ; { print NF}' stores.dat 

लेकिन यह बजाय सभी लाइनों रिटर्न केवल पहले और पहली पंक्ति के लिए यह 4

उत्तर

76
awk -F'|' '{print NF; exit}' stores.dat 

बस पहली पंक्ति के ठीक बाद छोड़ दें।

+1

या 'awk -F' | ' 'एनआर == 1 {प्रिंट एनएफ}' स्टोर्स.dat' –

+10

@ जयपालसिंह: जो पूरी फाइल को पढ़ेगा - इसके लिए कोई ज़रूरत नहीं है, जल्दी से बेहतर रोकें। – Mat

+0

वे दोनों एक ही सही आउटपुट लौटते प्रतीत होते हैं, क्या दूसरे (या कुछ अन्य लाभ) पर 1 का कोई प्रदर्शन लाभ है? – toop

9

के बजाय 1 लौटाता है जब तक कि आप वहां रिक्त स्थान का उपयोग नहीं कर रहे हैं, तो आप पहली पंक्ति पर | wc -w का उपयोग करने में सक्षम होना चाहिए।

wc "शब्द गणना" है, जो इनपुट फ़ाइल में शब्दों की गणना करता है। यदि आप केवल एक पंक्ति भेजते हैं, तो यह आपको कॉलम की मात्रा बताएगा।

+0

मैंने कोशिश की: head -1 stores.dat | wc -w लेकिन यह – toop

+0

के बाद मैं जो नहीं कर रहा हूं वह वापस नहीं आता है क्योंकि आप किसी स्थान के साथ '|' को प्रतिस्थापित नहीं कर रहे हैं - 'wc' शब्द गिनती है, जिसे अंतरिक्ष से अलग किया जाना चाहिए। 'Head -1 stores.dat | का प्रयोग करें tr '|' '' | wc -w' –

+2

पूर्णता के लिए उत्तर में अपनी टिप्पणी जोड़ें। – Xofo

28

यह एक समाधान (मेरे लिए: मैं awk बहुत बार उपयोग न करें): है

प्रदर्शन डेटा वाली फ़ाइल की पहली पंक्ति, नई-पंक्तियों के साथ सभी पाइप की जगह और फिर लाइनों की संख्या:

$ head -1 stores.dat | tr '|' '\n' | wc -l 
+6

मायानी कॉलम (एसएनपी डेटा सोचें) वाली फाइलों के लिए यह जाने का तरीका है। मैट का समाधान वापस आया "awk: प्रोग्राम सीमा पार हो गई: फ़ील्ड आकार = 32767 की अधिकतम संख्या।" –

1

आप अजगर स्थापित किया है आप की कोशिश कर सकते:

python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \ 
    stores.dat 
+0

इस विशेष मामले में, मानक इनपुट 'बिल्ली x.txt से पढ़ने के लिए यह छोटा है। पायथन-सी "प्रिंट raw_input()। गिनती ('|') + 1" ' –

+0

कम हाँ, लेकिन तेजी से नहीं, अगर बहुत लंबी फाइलें हैं! मुझे लगता है कि वह शुद्ध की आंखों में एक तेज समाधान चाहता था (मतलब निश्चित रूप से बड़ी) डेटा फाइलें। –

1

यह आमतौर पर मैं क्या उपयोग है क्षेत्रों की संख्या की गणना के लिए:

head -n 1 file.name | awk -F'|' '{print NF; exit}' 
4

आप की कोशिश कर सकते

बिल्ली फ़ाइल | awk '{प्रिंट एनएफ}'

1

पर्ल समाधान चटाई के awk समाधान के समान:

perl -F'\|' -lane 'print $#F+1; exit' stores.dat 

मैं 1000000 कॉलम के साथ एक फ़ाइल पर यह परीक्षण किया है।


क्षेत्र विभाजक खाली स्थान के (एक या अधिक रिक्त स्थान या टैब) एक पाइप के बजाय है:

perl -lane 'print $#F+1; exit' stores.dat 
0

बिल्ली केर प्रतिक्रिया के आधार पर। यह आदेश सोलारिस

awk '{print NF; exit}' stores.dat 
+0

और फिर आप स्वीकृत उत्तर पर उचित क्षेत्र विभाजक से कम हैं। यह उदाहरण इनपुट के लिए "1" वापस करेगा। –

+0

यह अनिवार्य रूप से फील्ड विभाजक के बिना स्वीकृत उत्तर जैसा ही है, क्योंकि बेजमिन 1 रिटर्न कहते हैं लेकिन अंतरिक्ष सीमित फ़ाइलों के लिए काम करना चाहिए। – discipulus

0

पर काम कर रहा है आप कोशिश कर सकते हैं:

head -1 stores.dat | grep -o \| | wc -l 
0

फ़ाइल में किसी भी पंक्ति का चयन करें (नीचे उदाहरण में, यह 2 पंक्ति है) और गिनती कॉलम, जहां की संख्या डेलीमीटर एक स्थान है:

sed -n 2p text_file.dat | tr ' ' '\n' | wc -l