कई आउटपुट फ़ाइलों में जाने के लिए स्टडआउट कैसे विभाजित करें?


12

कहो, मेरे पास एक कमांड है commandजो बड़ी संख्या में लाइनों को प्रिंट करने के लिए प्रिंट करता है:

line1
line2
.....
lineN

मैं आउटपुट को डिस्क में सहेजना चाहता हूं, लेकिन किसी एक फाइल के रूप में नहीं, बल्कि फाइलों के अनुक्रम के रूप में, जिनमें से प्रत्येक में stdout की 1000 लाइनें हैं:

file0001.txt:
-------------
line1
....
line1000

file0002.txt:
-------------
line1001
....
line2000

etc

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

जवाबों:


24

एक बार जब आप फाइल को सेव कर लेते हैं, तो आप हमेशा splitफाइल को टुकड़ों में या कई लाइनों के आधार पर कई फाइलों में फाइल कर सकते हैं ।

split -l 1000 output_file

या इससे भी बेहतर बस कोशिश करें

command | split -l 1000 -

यह आउटपुट स्ट्रीम को प्रत्येक 1000 लाइनों के साथ फाइलों में विभाजित करेगा (डिफ़ॉल्ट रूप से -l विकल्प के बिना 1000 लाइनें है)।

नीचे दिए गए कमांड आपको फ़ाइल नाम में एक उपसर्ग लगाने या लागू करने के लिए अतिरिक्त लचीलापन देंगे जो आउटपुट उत्पन्न होने और फ़ाइल में स्टोर करने के लिए विभाजित होता है।

command | split -l 1000 - small-


मैं भ्रमित हो गया, इसलिए दूसरों के लिए, split [arguments...] [input e.g. "-" for stdin] [output_prefix]उदाहरण के लिए: tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-100MB फ़ाइलों का एक गुच्छा नामांकित somedir.tar.part-000, 001, 002 ans इतने पर आउटपुट करेगा ।
थोरसुमोनर

3

आप बैश स्क्रिप्ट का उपयोग कर सकते हैं lines.bash

#!/bin/bash
a=0
while IFS='' read -r line
do
  printf -v filename "%04d.txt" "$((a++/1000))"
  echo "$line" >> $filename
done

और इसे इस प्रकार उपयोग करें:

cat long_file.txt | bash lines.bash

एकमात्र समस्या जिस पर मैंने गौर किया वह *साइन इन है long_file.txt(कोई इसे सही कर सकता है)।


2
IFSशब्द विभाजन से बचने के लिए खाली स्ट्रिंग पर सेट करें read-rबैकस्लैश को अक्षम करने के लिए उपयोग करें read-eबचने के लिए बैकस्लैश से बचने के लिए निकालें echo। शब्द विभाजन से बचने के लिए उद्धरण का उपयोग करें echo। का प्रयोग करें -vमें bashके बाद से 4.0 एक उप प्रक्रिया शुरू करने से बचने के लिए। पोस्ट-इंक्रीमेंट का उपयोग करें क्योंकि आपका वर्तमान कोड पहली फ़ाइल में केवल 999 लाइनों में होगा। a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
मैनेटवर्क

@manatwork धन्यवाद। केवल मेरे स्विच printfनहीं है -v। ( bash 4.2.10)। कम से कम यह की मैनपेज में नहीं हैprintf
xralf

1
man printfदस्तावेज़ / usr / bin / printf, जो जीवन में कभी भी पर्यावरण चर नहीं बना सकता है। देखें help printfके लिए printfनिर्मित खोल के प्रलेखन।
मैनटवर्क

@manatwork ठीक है। ++/भाग में अभी तक सिंटैक्स त्रुटि प्रतीत होती है ।
xralf

1
एक और बात: जब तक आपको स्पष्ट रूप से पैरामीटर विस्तार की आवश्यकता नहीं होती है, तब तक अंकगणितीय मूल्यांकन के अंदर सतर्कता का उपयोग करने की कोई आवश्यकता नहीं है। अंकगणितीय विस्तार में चर का मूल्यांकन वैसे भी किया जाता है।
मैनेटवर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.