किसी फ़ाइल को लाइन से विभाजित करें और परिणामस्वरूप फ़ाइल एक्सटेंशन पर नियंत्रण रखें


28

फ़ाइल विभाजन के लिए एक मानक कमांड है - विभाजन।

उदाहरण के लिए, यदि मुझे 10000 पंक्तियों के शब्द को कई टुकड़ों में विभाजित करना है, तो मैं उपयोग कर सकता हूं:

split -dl 10000 words wrd

और यह प्रपत्र की कई फाइलें पैदा करेगा।

लेकिन मैं उन फ़ाइलों के लिए एक विशिष्ट विस्तार करना चाहता हूं - उदाहरण के लिए, मैं wtd.01.txt, wrd.02.txt फाइलें प्राप्त करना चाहता हूं।

क्या इसे करने का कोई तरीका है?

जवाबों:


12

नहीं के साथ split, लेकिन आप बाद में आसानी से उनका नाम बदल सकते हैं, या आप इसमें कर सकते हैं awk:

awk '{filename = "wrd." int((NR-1)/10000) ".txt"; print >> filename}' inputfile

अच्छा लग रहा है - लेकिन काम नहीं करता है। आपके फॉर्म में, "अभिव्यक्ति के लिए` >> 'के बारे में शिकायत करता है "पुनर्निर्देशन में अशक्त स्ट्रिंग वैल्यू" है, और यदि "फ़ाइल" को "फ़ाइल नाम" के लिए "बदल" दिया गया है, तो फॉर्म की फाइलें पीडीएफ़ फ़ाइल का आउटपुट {{नंबर नंबर} {लाइन नंबर}। .txt (उनमें से बहुत से :)
Rogach

@Rogach क्षमा करें, मैंने इसका परीक्षण नहीं किया था, इसलिए मैं भूल गया कि पूर्णांक विभाजन नहीं करता है। मैंने इसका परीक्षण किया है।
केविन

49

यह तब उपलब्ध नहीं था, लेकिन अधिक हाल के संस्करणों ( ≥ 8.16) के gnu splitसाथ --additional-suffixस्विच के परिणामस्वरूप परिणाम पर नियंत्रण रखने के लिए उपयोग कर सकते हैं । से man split:

--additional-suffix=SUFFIX
              append an additional SUFFIX to file names.

तो उस विकल्प का उपयोग करते समय:

split -dl 10000 --additional-suffix=.txt words wrd

परिणामी टुकड़े स्वतः समाप्त हो जाएंगे .txt:

wrd00.txt
wrd01.txt
.........

3
मैक पर काम नहीं कर रहा
ericgu

2
मुझे आपकी चुगली बहुत पसंद है। मैं Apple दुनिया से एक यूनिक्स n00b हूं। मैं OS X Yosemite का उपयोग कर रहा हूं और मैं नहीं चाहता था कि दूसरे मेरी तरह दुर्घटनाग्रस्त हो जाएं और जल जाएं। मैंने डॉक्स पर परीक्षण और समीक्षा की और हमारे पास यह पैरामीटर नहीं है। मुझे कुछ याद आ गया होगा। developer.apple.com/library/mac/documentation/Darwin/Reference/...
ericgu

5
@swiftshokunin - मेरा जवाब gnu split, का हिस्सा है gnu coreutils। यदि आप स्थापित करने पर OSX भी उपलब्ध है coreutilsके माध्यम से homebrewटिप्पणी लेकिन यह है कि डिफ़ॉल्ट रूप से, पर OSX, gnuउपयोगिताओं एक है gउनके नाम के लिए prepended (जैसे gstatके बजाय stat) आप तो यह आह्वान के रूप में gsplit(या गाइड के अनुसार पथ को बदलने यहाँ अगर आप चाहते हैं splitOSX पर split) का उपयोग करने के लिए । HTH।
don_crissti

1
अच्छा जवाब। ओएस एक्स पर, काम gsplitकरने के लिए संख्यात्मक प्रत्यय (-d) प्राप्त करने के लिए उपयोग करें।
ब्रेंट फ़ॉस्ट

1
वाह, मुझे नहीं पता था कि gsplit है - यह शायद ऊपर उल्लिखित कोरयूटिल्स से है और इसमें --adडिशनल-प्रत्यय है। इस समाधान पर टिप्पणी करने वाले सभी को धन्यवाद :)
Rukasz Rysiak

13

ऐसे कार्यों को शेल के साथ सबसे अच्छा प्रबंधित किया जाता है। विभाजन का उपयोग करें और फिर फ़ाइलों का नाम बदलने के लिए एक सरल लूप लिखें। उदाहरण के लिए

for file in wrd.*
do
    mv "$file" "$file.txt"
done

आपके wrd.01, wrd.02, आदि फ़ाइलों का नाम बदलेगा, ताकि उन सभी में एक .txt एक्सटेंशन हो।


यह काफी स्पष्ट है, लेकिन यह बैश स्क्रिप्ट की संक्षिप्तता को तोड़ देगा।
रोजा

1
यूनिक्स दर्शन आपको सरल साधनों के एक सेट के साथ प्रदान करने के लिए है जिसे आप नौकरी करने के लिए संयोजित करते हैं। "बैश स्क्रिप्ट की संक्षिप्तता" आपके प्रश्न में एक स्पष्ट आवश्यकता नहीं थी।
काइल जोंस

7
पुनश्च: split+mvकॉम्बो अधिक है कि है 6 गुना तेजी से awk(लगभग 3s बनाम 18s एक 10 मिलियन लाइन इनपुट फ़ाइल (75 एमबी) के लिए) ... प्रत्येक पंक्ति में पाठ अपनी स्वयं की पंक्ति संख्या था ... फिर से बताते हुए के लिए धन्यवाद "स्पष्ट" :)
पीटर

3
PPS: मैं अभी इसे थोड़ा आगे बढ़ा रहा हूं। गति-अंतर, निर्मित फ़ाइलों की संख्या से संबंधित है। आउटपुट फ़ाइलों की संख्या की परवाह किए बिना प्रत्येक और प्रत्येक पंक्ति के लिए स्वरूपण और अंकगणितीय गणना की संख्या के समान होता है ... उपरोक्त उदाहरण के रूप में एक ही इनपुट फ़ाइल का उपयोग करना: जब वहाँ हैं 100 गुना कम फाइलें, split + mvकी तुलना में 75 गुना तेज है awk: जब 100 गुना अधिक फाइलें होती हैं, split + mvतो 1.5 गुना तेजी से होती है awk। तो, मेरे लिए, यह split + mvविधि जीतती है, हाथ नीचे। यह कॉन्सिस (यकीनन मोरेसो) के रूप में है, और से तेज है awk
15

1
यदि आप इसे 5 लाइनों के लंबे होने के बारे में चिंतित हैं, तो इसके बजाय यह प्रयास करें: for file in wrd.*; do mv "$file" "$file.txt"; done:)
टोनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.