2011-10-20 7 views
11

मुझे कुछ टेक्स्ट फ़ाइलों में से कुछ संख्याओं को चुनने की आवश्यकता है। मैं grep के साथ आवश्यक लाइनों को चुन सकता हूं, लेकिन लाइनों से संख्याओं को निकालने का तरीका नहीं जानता था। एक सहयोगी ने मुझे दिखाया है कि कैसे पर्ल के साथ बैश से यह करने के लिए:पाइथन perl -pe के बराबर है?

cat results.txt | perl -pe 's/.+(\d\.\d+)\.\n/\1 /' 

हालांकि, मैं आमतौर पर अजगर में कोड, नहीं पर्ल। तो मेरा सवाल यह है कि, क्या मैंने उसी तरह पाइथन का उपयोग किया हो सकता है? यानी, क्या मैं बैश से पायथन तक कुछ पाइप कर सकता था और फिर परिणाम सीधे सीधे स्टडआउट प्राप्त कर सकता था? ... यदि इसका कोई औचित्य हो। या पर्ल इस मामले में बस अधिक सुविधाजनक है?

+1

आप पुनर्विचार कर सकते हैं और केवल पाइथन में सभी पार्सिंग कर सकते हैं। पाइथन से पकड़ने के लिए यह बेहद आसान होगा। यदि आपको परेशानी है, तो बस एक और सवाल पोस्ट करें कि "मैं इन लाइनों को पायथन में कैसे पार्स कर सकता हूं", और 5 मिनट बाद आपके पास कोड – TJD

+0

@TJD होगा: पूरी तरह से सहमत हैं। – heltonbiker

+0

@TJD: सच है। मैं उस पर विचार करूंगा। – Nagel

उत्तर

9

हाँ, आप अजगर कमांड लाइन से उपयोग कर सकते हैं। python -c <stuff><stuff> को पायथन कोड के रूप में चलाएगा। उदाहरण:

python -c "import sys; print sys.path" 

वहाँ पर्ल (स्वचालित इनपुट/आउटपुट पंक्ति-दर-पंक्ति प्रसंस्करण) के लिए -p विकल्प के लिए एक सीधा बराबर नहीं है, लेकिन है कि ज्यादातर क्योंकि अजगर $_ की इसी अवधारणा का उपयोग नहीं करता है और क्या नहीं है कि पर्ल करता है - पायथन में, सभी इनपुट और आउटपुट मैन्युअल रूप से किया जाता है (raw_input()/input(), और print/print()) के माध्यम से।


अपने विशेष उदाहरण के लिए

: (।। जाहिर है कुछ और अधिक बोझल यह शायद बेहतर है सिर्फ वास्तविक अजगर में यह करने के लिए स्क्रिप्ट लिखने के लिए)

cat results.txt | python -c "import re, sys; print ''.join(re.sub(r'.+(\d\.\d+)\.\n', r'\1 ', line) for line in sys.stdin)" 

+0

आह, धन्यवाद! आप मेरे आगे थे :) – Nagel

+0

विचित्र रूप से, पाइथन I का उपयोग कर रहा है (2.7.1) अर्धविरामों के बाद इनलाइन 'लूप' की तरह प्रतीत नहीं होता है - सरल आदेश काम करते हैं, लेकिन अधिक जटिल संरचनाएं ' SyntaxError'। – duskwuff

+0

@duskwuff - इसकी उम्मीद है। अर्धविरामों के पास ब्लॉक निर्दिष्ट करने का कोई तरीका नहीं है। आप इसके बजाय एक समझ/जनरेटर अभिव्यक्ति का उपयोग कर सकते हैं। – Amber

2

आप उपयोग कर सकते हैं:

$ python -c '<your code here>' 
+0

त्वरित उत्तर के लिए धन्यवाद (आप और @ एंबर दोनों के लिए)! यह वही है जो मैं खोज रहा था, लेकिन काफी नहीं। यह perl -e के समान है, लेकिन यह आउटपुट को stdout पर प्रिंट नहीं करता है। तो 'पायथन-सी 2 + 2' कुछ भी नहीं देता है। (आप 'python -c' a = 2 + 2; निश्चित रूप से प्रिंट करें 'का उपयोग कर सकते हैं, लेकिन आपको मेरा बिंदु मिल गया है?) – Nagel

+0

@Nagel: सभी उत्तर कुछ कमांड लाइन विधि के बारे में हैं, लेकिन क्या आप एक स्क्रिप्ट का उपयोग कर रहे हैं? (फ़ाइलों का एक समूह पढ़ने के लिए, मुझे यकीन है कि एक स्क्रिप्ट का उपयोग करें) – heltonbiker

0

आप के लिए अजगर का उपयोग कर सकते python -c का उपयोग कर सीधे अपने बैश कमांड लाइन से कोड निष्पादित करें, या sys.stdin का उपयोग करके आप stdin पर पाइप इनपुट इनपुट कर सकते हैं, here देखें।

1

आप सिद्धांत में कर सकते हैं, लेकिन पाइथन के पास कहीं भी रेगेक्स जादू के पास कहीं भी नहीं है, इसलिए परिणामी कमांड अधिक कठिन होगा, खासकर जब आप re आयात किए बिना नियमित अभिव्यक्तियों का उपयोग नहीं कर सकते हैं (और आप sys.stdin के लिए शायद sys की आवश्यकता होगी)।

अजगर अपने सहकर्मी के पर्ल एक लाइनर के बराबर लगभग है:

import sys, re 
for line in sys.stdin: 
    print re.sub(r'.+(\d\.\d+)\.\n', r'\1 ', line) 
+0

मानक मॉड्यूल आयात करना कम से कम पाइथन में "अशुद्ध" या अन्यथा कम मजबूत कोड नहीं माना जाना चाहिए। – heltonbiker

+0

धन्यवाद! मुझे बहुत संदेह था। मान लीजिए कि मैं इस तरह के कार्य के लिए कुछ बुनियादी पर्ल सीखूंगा :) – Nagel

+0

@heltonbiker का एक बिंदु है, लेकिन परिणामी पायथन कोड लंबा है, और कमांड लाइन उपकरण के रूप में उपयोग करने के लिए थोड़ा अनावश्यक लगता है। – Nagel

1

आप एक समस्या है जो कई मायनों हल किया जा सकता है।

मुझे लगता है कि आपको नियमित रूप से पाइथन से नियमित अभिव्यक्ति (आपके उदाहरण में क्या कर रहा है) का उपयोग करने पर विचार करना चाहिए। नियमित अभिव्यक्ति re मॉड्यूल में हैं। एक उदाहरण होगा:

import re 
filecontent = open('somefile.txt').read() 
print re.findall('.+(\d\.\d+)\.$', filecontent) 

(मैं के बजाय लाइन अंत के लिए '\ n' $ उपयोग करने को प्राथमिकता है, क्योंकि लाइन अंत परिचालन प्रणाली और फ़ाइल एन्कोडिंग के बीच अलग हैं)

आप बैश कॉल करने के लिए चाहते हैं पाइथन के अंदर से आदेश, आप इसका उपयोग कर सकते हैं:

import os 
os.system(mycommand) 

जहां कमांड बैश कमांड है।मैं इसे हर समय उपयोग करता हूं, क्योंकि पाइथन की तुलना में कुछ ऑपरेशन बाश में प्रदर्शन करने के लिए बेहतर होते हैं।

अंत में, यदि आप grep के साथ संख्याओं को निकालना चाहते हैं, तो -o विकल्प का उपयोग करें, जो केवल मिलान किए गए भाग को प्रिंट करता है।

0

पर्ल (या sed) अधिक सुविधाजनक है। हालांकि यह संभव है, अगर बदसूरत:

python -c 'import sys, re; print "\n".join(re.sub(".+(\d\.\d+)\.\n","\1 ", l) for l in sys.stdin)'