2012-04-04 8 views
5

मैं थोड़ी देर के लिए कोशिश कर रहा हूँ अब तक कोई सफलता के साथ बाहर काम करने के लिए इस मैं एक कमांड आउटपुट कि मैं इसे आगे की प्रक्रिया केमैं, यहाँ awk, SED के बारे में हैरान हूँ आदि

के लिए उपयुक्त बनाने के लिए चबाना करने की जरूरत है

पाठ मेरे पास है:

1/2 [3] (27/03/2012 19:32:54) word word word word 4/5 

क्या मैं जरूरत केवल संख्या को निकालने के लिए है 1/2 [3] 4/5 तो यह दिखेगा:

1 2 3 4 5 

तो, मूल रूप से मैं था सभी पात्रों को बाहर करने की कोशिश कर रहा था वें पर अंक नहीं हैं, जैसे "/", "[", "]", आदि मैंने एफएस के साथ अजीब कोशिश की, regexp का उपयोग करने की कोशिश की, लेकिन मेरी कोई भी कोशिश सफल नहीं हुई।

मैं इसके बाद पहले कुछ जोड़ूंगा: 1 सेकंड: 2 तीसरा: 3 .... आदि कृपया ध्यान रखें कि मैं एक फाइल के बारे में बात कर रहा हूं जिसमें एक ही संरचना वाली रेखाएं हैं, लेकिन मैं पहले से ही है, हालांकि awk का उपयोग कर

awk '{sum1+=$1 ; sum2+=$2 ;......etc} END {print "first:"sum1 " second:"sum2.....etc}' 

के साथ हर स्तंभ योग करने के लिए लेकिन सबसे पहले मैं केवल प्रासंगिक नंबर, तारीख के बीच में है कि निकालने के लिए की आवश्यकता होगी "()" के बारे में पूरी तरह से छोड़ा जा सकता है, लेकिन वे नंबर दिए गए हैं भी, इसलिए अंकों द्वारा फ़िल्टरिंग पर्याप्त नहीं होगी क्योंकि यह उनसे भी मेल खाएगा

आशा है कि आप मेरी मदद कर सकते हैं अग्रिम धन्यवाद!

उत्तर

5

यह: sed -r 's/[(][^)]*[)]/ /g; s/[^0-9]+/ /g' काम करना चाहिए। यह दो पास बनाता है, पहले कोष्ठक अभिव्यक्तियों को हटाता है और फिर एकल रिक्त स्थान वाले गैर-अंकों के सभी रनों को प्रतिस्थापित करता है।

+0

बढ़िया! बिल्कुल मुझे क्या चाहिए! यहां बताया गया है कि पूरा आदेश फ़ाइल test.txt में शामिल है: '10/20 [30] (दिनांक) शब्द शब्द शब्द शब्द 40/50 10/20 [30] (दिनांक) शब्द शब्द शब्द शब्द 40/50 ' तो, जब चल रहा है: ' cat test.txt | sed -r's/[(] [^]] * [)]// जी; एस/[^ 0-9] +// जी '| अजीब '{sum1 + = $ 1; sum2 + = $ 2; sum3 + = $ 3; sum4 + = $ 4; sum5 + = $ 5} अंत {प्रिंट "पहला:" sum1, "दूसरा:" sum2, "तीसरा:" sum3, "चौथा:" sum4, "पांचवां:" sum5} '' और यह आउटपुट: ' पहला: 20 सेकंड : 40 तीसरा: 60 चौथा: 80 पांचवां: 100' बहुत बहुत धन्यवाद @ Michał Kosmulski आप लोग महान हैं – TuxSax

+0

बीटीडब्ल्यू, क्या टिप्पणियां उत्तर और प्रश्नों की तरह बेहतर दिखने का कोई तरीका है? कोड ब्लॉक और इंडेंटेशन, लाइन ब्रेक इत्यादि की तरह – TuxSax

+0

आपका स्वागत है। स्वरूपण के लिए, इस पृष्ठ को देखें: http://stackoverflow.com/editing-help#comment-formatting –

2

आप sed -e 's/(.*)//' -e 's/[^0-9]/ /g' जैसे कुछ कर सकते हैं। यह अंतरिक्ष के साथ सभी गैर अंकों वाले पात्रों को प्रतिस्थापित करने के बजाय राउंड ब्रैकेट के अंदर सबकुछ हटा देता है। अतिरिक्त रिक्त स्थान से छुटकारा पाने के लिए आप column -t करने के लिए इसे फ़ीड कर सकते हैं:

$ echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' | sed -e 's/(.*)//' -e 's/[^0-9]/ /g' | column -t 
1 2 3 4 5 
+0

1UP यह काफी था जो मैं आया था। – MattH

0

, नीचे देखें अगर यह तुम क्या चाहते है:

kent$ echo "1/2 [3] (27/03/2012 19:32:54) word word word word 4/5"|sed -r 's/\([^)]*\)//g; s/[^0-9]/ /g;s/ */ /g' 
1 2 3 4 5 
:

kent$ echo "1/2 [3] (27/03/2012 19:32:54) word word word word 4/5"|sed -r 's/\([^)]*\)//g; s/[^0-9]/ /g' 
1 2 3      4 5 

आप इसे बेहतर देखने के लिए चाहते हैं, तो

0

यह आपको ब्रांड्स में टेक्स्ट को छोड़कर निकाले गए अंकों को देगा:

digits=$(echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' |\ 
     sed 's/(.*)//' | grep -o '[0-9][0-9]*') 
echo $digits 

या शुद्ध एसईडी समाधान:

echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' |\ 
sed -e 's/(.*)//' -e 's/[^0-9]/ /g' -e 's/[ \t][ \t]*/ /g' 

उत्पादन:

1 2 3 4 5 
+0

मैं grep -o [0-9] के बारे में सोच रहा था, हालांकि यह संख्या असफल हो जाएगी यदि संख्या में दो अंक हैं, जैसे 1/20 [35] ... – Kent

+0

मैंने अपना जवाब संपादित किया और शुद्ध sed के आधार पर एक और विकल्प जोड़ा। – anubhava

0
awk '{ first+=gensub("^([0-9]+)/.*","\\1","g",$0) 
     second+=gensub("^[0-9]+/([0-9]+) .*","\\1","g",$0) 
     thirdl+=gensub("^[0-9]+/[0-9]+ \[([0-9]+)\].*","\\1","g",$0) 
     fourth+=gensub("^.* ([0-9]+)/[0-9]+ *$","\\1","g",$0) 
     fifth+=gensub("^.* [0-9]+/([0-9]+) *$","\\1","g",$0) 
     } 
     END { print "first: " first " second: " second " third: " third " fourth: " fourth " fifth: " fifth 
     } 

आपके लिए काम कर सकता है।awk साथ

0

एक पास पर्याप्त है अगर आप एक फैंसी क्षेत्र विभाजक सेट:

awk -F '[][/ ]' ' 
    {s1+=$1; s2+=$2; s3+=$4; s4+=$(NF-1); s5+=$NF} 
    END {printf("first:%d second:%d third:%d fourth:%d fifth:%d\n", s1, s2, s3, s4, s5)} 
' 
1

TXR:

@(collect) 
@one/@two [@three] (@date @time) @(skip :greedy) @four/@five 
@(filter :tonumber one two three four five) 
@(end) 
@(bind (first second third fourth fifth) 
     @(mapcar (op apply +) (list one two three four five))) 
@(output) 
first:@first second:@second third:@third fourth:@fourth fifth:@fifth 
@(end) 

स्लैश, अंतरिक्ष, खुला ब्रैकेट या करीबी ब्रैकेट में से किसी एक के लिए एक क्षेत्र को अलग करती है डेटा:

1/2 [3] (27/03/2012 19:32:54) word word word word 4/5 
10/20 [30] (27/03/2012 19:32:54) word word 40/50 

रन:

$ txr data.txr data.txt 
first:11 second:22 third:33 fourth:44 fifth:55 

आसान कुछ त्रुटि जाँच जोड़ने के लिए:

@(collect) 
@ (cases) 
@one/@two [@three] (@date @time) @(skip :greedy) @four/@five 
@ (or) 
@line 
@ (throw error `badly formatted line: @line`) 
@ (end) 
@ (filter :tonumber one two three four five) 
@(end) 
@(bind (first second third fourth fifth) 
     @(mapcar (op apply +) (list one two three four five))) 
@(output) 
first:@first second:@second third:@third fourth:@fourth fifth:@fifth 
@(end) 

$ txr data.txr - 
foo bar junk 
txr: unhandled exception of type error: 
txr: ("badly formatted line: foo bar junk") 
Aborted 

TXR मजबूत प्रोग्रामिंग के लिए है। मजबूत टाइपिंग है, इसलिए आप तारों को संख्याओं के रूप में नहीं मान सकते हैं क्योंकि उनमें अंक होते हैं। वैरिएबल को उपयोग से पहले बाध्य होना पड़ता है, और इसलिए गलत वर्तनी वाले चर चुपचाप शून्य या खाली पर डिफ़ॉल्ट नहीं होते हैं, बल्कि unbound variable <name> in <file>:<line> प्रकार त्रुटि उत्पन्न करते हैं। पाठ निष्कर्षण एक प्रारूप में इनपुट को गलत तरीके से परिभाषित करने के लिए कई विशिष्ट संदर्भों के साथ किया जाता है।