2010-07-20 15 views
21

पास करके फ़ाइल से लाइन पढ़ने के लिए यूनिक्स कमांड मैं एक बड़ी फ़ाइल (लगभग 5 मिलियन रिकॉर्ड के साथ) लाइन नंबर पास करके एक लाइन प्राप्त करने के लिए एक यूनिक्स कमांड की तलाश में हूं। उदाहरण के लिए 10 वीं लाइन प्राप्त करने के लिए, मैं कुछ करना चाहता हूं जैसेयूनिक्स कमांड लाइन नंबर

command file-name 10 

क्या ऐसा कोई आदेश उपलब्ध है? हम इसे प्रत्येक रिकॉर्ड के माध्यम से लूप करके कर सकते हैं लेकिन यह समय लेने वाली प्रक्रिया होगी।

उत्तर

39

यह forum entry पता चलता है:

sed -n '52p' (file) 

एक फ़ाइल की 52th लाइन मुद्रण के लिए।

head -n<lineno> <file> | tail -n1 

यही है, आप <lineno> लाइनों देना होगा उसके बाद ही निर्गम (अपनी लाइन) की अंतिम पंक्ति दे:

+0

क्यों()? यह मेरे बैश संस्करण को एक त्रुटि देता है, हालांकि बाद के संस्करणों में ठीक किया गया हो सकता है। – Anders

+1

उसका मतलब है कि आप फ़ाइल को – Malfist

+3

फ़ाइल के साथ प्रतिस्थापित कर सकते हैं, मैं मुद्रण के बाद छोड़कर दस के कारक (जब 100000 लाइनों वाली फ़ाइल के साथ उपयोग किया जाता है) द्वारा इसे गति देने में सक्षम था: 'sed -n '52 {p; q} '' – Philipp

3

आप की तरह कुछ कर सकता है।

संपादित करें: ऐसा लगता है कि यहां सभी समाधान बहुत धीमे हैं। हालांकि, परिभाषा के अनुसार आपको सभी रिकॉर्ड्स के माध्यम से पुन: प्रयास करना होगा क्योंकि ऑपरेटिंग सिस्टम के पास रेखा-उन्मुख फ़ाइलों को पार्स करने का कोई तरीका नहीं है क्योंकि फाइल बाइट उन्मुख हैं। (कुछ अर्थों में, इन सभी कार्यक्रमों को करने के लिए \n या \r वर्णों की संख्या गिनती है।) एक महान उत्तर के बदले में, मैं इन आदेशों में से कई के सिस्टम पर भी समय प्रस्तुत करूंगा!

[[email protected] ~]$ time sed -n '145430980p' br.txt 
0b10010011111111010001101111010111 

real 0m25.871s 
user 0m17.315s 
sys 0m2.360s 
[[email protected] ~]$ time head -n 145430980 br.txt | tail -n1 
0b10010011111111010001101111010111 

real 0m41.112s 
user 0m39.385s 
sys 0m4.291s 
[[email protected] ~]$ time awk 'NR==145430980{print;exit}' br.txt 
0b10010011111111010001101111010111 

real 2m8.835s 
user 1m38.076s 
sys 0m3.337s 

तो, अपने सिस्टम पर, ऐसा लगता है sed -n '<lineno>p' <file> समाधान की तरह सबसे तेजी से है!

1

आप उपयोग awk

awk 'NR==10{print;exit}' file 

10 वीं लाइन मुद्रण ताकि awk 5 लाख रिकॉर्ड आगे फ़ाइल को संसाधित नहीं करेंगे के बाद एक निकास डाल सकते हैं।

5

आगे बढ़ना, इसे करने के कई तरीके हैं, और अन्य संबंधित सामान।

यदि आप चाहते हैं कई पंक्तियों मुद्रित करने के लिए,

sed -n -e 'Np' -e 'Mp' 

कहाँ एन और एम लाइनों जो केवल प्रिंट किया जाएगा रहे हैं। इसका संदर्भ लें 10 Awesome Examples for Viewing Huge Log Files in Unix

+1

क्या होगा यदि मैं फ़ाइल की 1000 लाइनों से एक से अधिक रिकॉर्ड चाहता हूं? मैं इस कमांड में कई लाइनों को कैसे पारित कर सकता हूं? – Pooja25

संबंधित मुद्दे