ऐसी कई स्थितियाँ होती हैं जहाँ आपको संख्या और आकार दोनों में बड़े फाइलों का त्वरित विश्लेषण, संशोधन और प्रोसेसिंग करनी पड़ती है। अक्सर ये फाइलें टेक्स्ट-आधारित Comma Separated Values (CSV) फाइलें होती हैं। Excel, LibreOffice या OpenOffice जैसे सामान्य स्प्रेडशीट अनुप्रयोगों से उन्हें खोलना मशीन की मेमोरी पर भार डाल देता है। साथ ही, कई फाइलों को एक बैच में प्रोसेस करना अक्सर कुछ घंटों बाद किसी अनपेक्षित फाइल विसंगति के कारण विफल हो जाता है।
नतीजतन, आपका बहुत समय फ्रीज़ हुई स्क्रीन, रिस्टार्ट और लंबा इंतज़ार करने में बीतता है।
हालाँकि, इन कार्यों में से अधिकांश कुछ पंक्तियों के कोड से किए जा सकते हैं। इससे भी बढ़कर, कुछ सरल शेल कमांड लाइनों की परिचितता समय बचाने और झुंझलाहट घटाने में बहुत सहायक हो सकती है।
यह पोस्ट उन कुछ शेल कमांड्स का अवलोकन देगी जिन्हें मैं लगभग हर दिन उपयोग करता हूँ। आशा है ये आपके काम आएँगे।
त्वरित नोट्स
ध्यान दें कि अलग-अलग प्रकार के शेल (bash, zsh, ...) होते हैं, जिनमें bash सबसे सामान्य है क्योंकि यह OS X और प्रमुख linux डिस्ट्रीब्यूशनों पर डिफ़ॉल्ट शेल है। Zsh (और Oh My Zsh) एक लोकप्रिय और शक्तिशाली विकल्प है। इस ब्लॉग पोस्ट में दिए गए शेल कमांड OS X (macOS) पर bash में परखे गए हैं और अन्य शेल्स व वातावरणों में भी काम करने चाहिए।
आगे दिए गए सभी उदाहरण UCI Machine Learning रिपॉज़िटरी के adult डेटासेट पर आधारित हैं जिसे "Census Income" डेटासेट भी कहा जाता है, और यहाँ उपलब्ध है। यह डेटा सेट आम तौर पर जनगणना डेटा के आधार पर यह भविष्यवाणी करने के लिए इस्तेमाल होता है कि आय \$50K/वर्ष से अधिक है या नहीं। 48842 पंक्तियों और 14 विशेषताओं के साथ, यह बहुत बड़ा डेटासेट नहीं है पर उदाहरणों को समझाने के लिए पर्याप्त है। यद्यपि डेटा .data एक्सटेंशन के साथ संग्रहीत है, यह एक सुव्यवस्थित CSV फाइल है। साथ चलने के लिए डेटासेट डाउनलोड करने में संकोच न करें!
गिनती करें wc के साथ
किसी नई टेक्स्ट-आधारित फाइल के लिए, आप जानना चाहेंगे कि उसमें कितनी पंक्तियाँ हैं। यह word count wc -l कमांड से किया जा सकता है:
यह बताता है कि adult.data फाइल में 32562 पंक्तियाँ हैं। -l फ्लैग wc को लाइनों की गिनती करने को कहता है। लेकिन आप wc का उपयोग शब्दों की गिनती के लिए भी -w फ्लैग के साथ कर सकते हैं।
wc कमांड किसी डायरेक्टरी में फाइलों की संख्या भी गिन सकता है, यदि आप साधारण ls -l कमांड के आउटपुट को wc के इनपुट के रूप में दें। किसी कमांड के आउटपुट को पाइप प्रतीक | के जरिए दूसरी कमांड के इनपुट के रूप में देना एक उपयोगी शेल पैटर्न है जिसे pipelining कहा जाता है। आप इसे इस पोस्ट के कई उदाहरणों में देखेंगे।
मान लें अब आपके पास बहुत सारी फाइलों वाला एक फोल्डर है। निम्न कमांड आपको ठीक-ठीक बताएगी कि उसमें कितनी फाइलें हैं:
यदि आप वाइल्डकार्ड्स और सबफोल्डर्स जोड़ना शुरू करें तो wc के और भी कई उपयोग हैं।
अब वापस अपनी adult.data फाइल पर लौटते हैं और head कमांड से शुरुआती पंक्तियाँ देखते हैं। डिफ़ॉल्ट रूप से, head 10 पंक्तियाँ आउटपुट करता है; आप -n फ्लैग का उपयोग करके आउटपुट को पहले 2 पंक्तियों तक सीमित कर सकते हैं।
और आप देखते हैं कि फाइल में हेडर पंक्ति नहीं है। कॉलम के नाम फाइल में मौजूद नहीं हैं। आप cat कमांड का उपयोग करके दो फाइलों को जोड़कर वह हेडर पंक्ति जोड़ सकते हैं।
फाइलें जोड़ें cat के साथ
cat कमांड किसी फाइल की सामग्री को स्टैंडर्ड आउटपुट (यानी आपका टर्मिनल) पर प्रिंट करता है। इसे फाइलों की एक शृंखला को जोड़ने के लिए भी इस्तेमाल किया जा सकता है। कमांड cat file_1.csv file_2.csv > target_file.csvfile_1.csv और file_2.csv दोनों की सामग्री को target_file.csv में मर्ज कर देगा, जिसमें file_2.csv की सामग्री file_1.csv के अंत में जोड़ दी जाएगी।
हेडर फाइल मूल डेटासेट में नहीं है और आपको इसे बनाना होगा। ऐसा करने के लिए, आप कॉलम नामों की कॉमा-सेपरेटेड सूची को header.csv फाइल में echo करते हैं।
$ echo"age,workclass,fnlwgt,education,education-num,marital-status,occupation,relationship,race,sex,capital-gain,capital-loss,native-country,class"> header.csvसंचालित द्वारा
इस उदाहरण में, आपने शेल रिडायरेक्शन > कैरेक्टर का उपयोग cat के आउटपुट को adult.csv फाइल में डंप करने के लिए किया। यदि फाइल मौजूद नहीं है तो > फाइल बना देगा, और यदि फाइल पहले से मौजूद है तो उसकी सामग्री को पूरी तरह बदल देगा। प्रतीक को दोगुना करना >> नई सामग्री को किसी मौजूदा फाइल के अंत में जोड़ देगा बिना उसकी वर्तमान सामग्री मिटाए।
अब header.csv फाइल को adult.data फाइल की शुरुआत में जोड़ते हैं। साथ ही, आप adult.data का नाम बदलकर adult.csv रख देते हैं क्योंकि, आखिरकार, यह CSV फ़ॉर्मैटेड फाइल है।
एक और सामान्य डेटा माइनिंग स्थिति तब आती है जब कोई फाइल भ्रष्ट या गलत फॉर्मैट में होती है, जैसे गैर-UTF-8 कैरेक्टर्स या गलत जगह पर लगा कॉमा। आप sed कमांड का उपयोग करके बिना फाइल खोले ही उसे सही कर सकते हैं।
जनरिक sed पैटर्न है
$ sed"s/<string to replace>/<string to replace it with>/g"<source_file>><target_file>.संचालित द्वारा
adult.csv डेटासेट में गुम मानों के लिए ? कैरेक्टर का उपयोग किया गया है। आप sed का उपयोग करके उस कैरेक्टर को बेहतर डिफ़ॉल्ट मान से बदल सकते हैं। खाली स्ट्रिंग गुम मान के संकेत के रूप में बेहतर है क्योंकि Pandas DataFrame में डेटा लोड करते समय इसे NaN के रूप में इंटरप्रेट किया जाएगा।
यह आपको उन 2399 पंक्तियों की गिनती देता है जिनमें कम से कम एक कॉलम में ? से दर्शाया गया गुम मान है। निम्न कमांड सभी ? वाले कॉलमों को खाली स्ट्रिंग से बदल देगी। वे सभी सेल जिनमें केवल ? है और उसके बाद एक स्पेस है, अब वास्तव में खाली होंगे।
ध्यान दें कि आपने स्रोत और लक्ष्य स्ट्रिंग्स में कॉलम डिलिमिटर , का उपयोग किया है ताकि डेटासेट के अन्य हिस्सों में मौजूद वास्तविक प्रश्नवाचक चिह्नों को बदलने से बचा जा सके।
बड़ी फाइल का सबसेट बनाना
मान लें अब आप 3 करोड़ से अधिक पंक्तियों वाली फाइल से निपट रहे हैं। जब आप अपना Python या R स्क्रिप्ट बनाते हैं, तो आप अपने वर्कफ़्लो को पूरे डेटासेट को मेमोरी में लोड किए बिना, मूल बड़ी फाइल के केवल एक सैंपल पर परीक्षण करना चाहेंगे। आप head और tail के संयोजन का उपयोग करके मूल डेटासेट का एक उपनमूना बना सकते हैं।
head फाइलों के शुरुआती हिस्से को आउटपुट करता है;
tail फाइलों के अंतिम हिस्से को आउटपुट करता है
जैसा आपने पहले देखा, ये कमांड्स -n फ्लैग लेते हैं, जो --lines के लिए है, और आउटपुट में पंक्तियों की संख्या को सीमित करता है। tail-f फ्लैग भी लेता है जहाँ f--follow के लिए है, जो फाइल के अंत में पंक्तियाँ जुड़ते ही जुड़े हुए डेटा को आउटपुट करता है। यह विशेष रूप से तब सुविधाजनक है जब आपके स्क्रिप्ट चलते समय आप tail -f <logfile> से लॉग फाइलों की निगरानी करते हैं।
पाइप प्रतीक | को head और tail के साथ मिलाकर, आप स्रोत फाइल के भीतर से निश्चित संख्या में पंक्तियाँ निकाल सकते हैं और सामग्री को एक सबसेट फाइल में एक्सपोर्ट कर सकते हैं। उदाहरण के लिए, पंक्ति 100 से शुरू होकर 20 पंक्तियाँ निकालने के लिए:
$ head-n120 adult.csv |tail-n20> adult_sample.csvसंचालित द्वारा
ध्यान दें कि आप पहले head के साथ first_line + number_of_lines लेते हैं और फिर tail के साथ number_of_lines लेते हैं। जनरिक सबसेटिंग कमांड है:
$ head -n <total_lines><source_file>| tail -n <number_of_lines>><target_file>संचालित द्वारा
जहाँ total_lines = first_line + number_of_lines। हालाँकि, आपकी नई सैंपल्ड फाइल में अब हेडर पंक्ति नहीं है। हम पहले से जानते हैं कि सबसेट फाइल में header.csv फाइल को जोड़कर cat का उपयोग करके हेडर कैसे वापस जोड़ें:
$ cat adult_sample.csv header.csv > adult_sample_with_header.csv
संचालित द्वारा
ध्यान दें कि आपने स्रोत फाइलनाम adult\_sample.csv को लक्ष्य फाइलनाम के रूप में उपयोग नहीं किया, बल्कि इसके बजाय adult\_sample\_with\_header.csv नामक नई फाइल बनाई। cat का उपयोग करते समय स्रोतों में से किसी एक के समान नाम को लक्ष्य के रूप में रखने से अप्रत्याशित फाइल सामग्री प्राप्त होगी। बेहतर है कि cat कमांड के आउटपुट के रूप में नई फाइल बनाई जाए।
डुप्लिकेट ढूँढना uniq के साथ
uniq कमांड के साथ आप किसी फाइल में एक-दूसरे से सटी हुई दोहराई गई पंक्तियाँ खोज सकते हैं। uniq कई फ्लैग लेता है, जिनमें अधिक उपयोगी हैं:
uniq -c: प्रत्येक पंक्ति में पुनरावृत्ति की गिनती जोड़ता है;
uniq -d: केवल डुप्लिकेट पंक्तियाँ आउटपुट करता है; और
uniq -u: केवल यूनिक पंक्तियाँ आउटपुट करता है।
हालाँकि, uniq कोई स्मार्ट कमांड नहीं है। यदि दोहराई गई पंक्तियाँ एक-दूसरे के पास नहीं हैं तो उनका पता नहीं चलेगा। इसका मतलब है कि आपको पहले फाइल को sort करना होगा। यह कमांड adult.csv में डुप्लिकेट पंक्तियों की संख्या गिनती है।
और दिखाता है कि वहाँ 23 डुप्लिकेट हैं। अगला कमांड सभी पंक्तियों के आउटपुट को पुनरावृत्ति गिनती सहित लेता है, उल्टे क्रम में सॉर्ट करता है और पहली 3 डुप्लिकेट पंक्तियाँ आउटपुट करता है:
sort और uniq को अलग-अलग फ्लैग्स के साथ मिलाकर कई शक्तिशाली विकल्प प्राप्त किए जा सकते हैं। इन कमांड्स को आगे एक्सप्लोर करने के लिए man sort और man uniq का उपयोग करें।
कॉलम चुनना cut के साथ
CSV फाइलों और शेल कमांड्स की अच्छी बात यह है कि आप cut का उपयोग करके किसी विशेष कॉलम का चयन कर कॉलम स्तर पर भी काम कर सकते हैं। cut दो मुख्य फ्लैग लेता है: कॉलम डिलिमिटर निर्दिष्ट करने के लिए -d और जिन कॉलमों पर काम करना है उन्हें निर्दिष्ट करने के लिए -f। निम्न उदाहरण में, आप cut का उपयोग श्रेणीगत चर workclass (कॉलम 2) द्वारा लिए गए यूनिक मानों की संख्या पता करने के लिए करते हैं।
पहले workclass कॉलम चुनें और सही कॉलम है यह सत्यापित करने के लिए आउटपुट को head में पाइप करें:
$ cut-d","-f2 adult.csv |head-3
workclass
State-gov
Self-emp-not-incसंचालित द्वारा
अब, यूनिक की गिनती के लिए, आप cut के आउटपुट को sort करते हैं और परिणाम को uniq -c में पाइप करते हैं, इस प्रकार:
जो आपको बताता है, उदाहरण के लिए, कि आपके पास 1837 null मान हैं, और मुख्य श्रेणी काफी अंतर से Private है, जिसकी 22969 आवृत्तियाँ हैं।
ऊपर दी गई कमांड लाइन value_counts() मेथड के समान है, जब इसे adult.csv डेटा वाले DataFrame पर लागू किया जाता है।
लूपिंग
अब तक, आपने ज्यादातर एक फाइल पर काम किया है। बड़ी संख्या में फाइलों का नाम बदलने, प्रोसेस करने या ट्रांसफर करने के लिए, आपको अपनी शेल टूलकिट में लूप जोड़ना चाहिए। bash शेल में लूप का जनरिक फ़ॉर्मैट है:
इसे काम में लेते हैं। मान लें आपके पास 1000 फाइलें हैं जिनके फाइलनाम में स्पेस हैं और आप प्रत्येक स्पेस को अंडरस्कोर "_" से बदलना चाहते हैं।
replace_source=' 'replace_target='_'forfilenamein ./*.csv;donew_filename=${filename//$replace_source/$replace_target}mv"$filename""$new_filename"doneसंचालित द्वारा
इस उदाहरण में,
आप पहले दो वेरिएबल घोषित करते हैं: replace_source और replace_target क्रमशः स्पेस और अंडरस्कोर कैरेक्टर्स के प्लेसहोल्डर के रूप में
आप वर्तमान फोल्डर में सभी *.csv फाइलों पर लूप लगाते हैं
प्रत्येक filename के लिए, आप हर स्पेस को अंडरस्कोर से बदलकर एक new_filename बनाते हैं
और आप mv कमांड के साथ वर्तमान फाइलनाम से नए फाइलनाम पर फाइल का नाम बदल देते हैं
वास्तव में, आपने न केवल किसी डायरेक्टरी में फाइलों पर लूप लगाया, बल्कि वेरिएबल्स भी बनाए।
वेरिएबल्स
आप शेल कमांड की इस भूमिका का अंत वेरिएबल्स के साथ करेंगे। शेल में वेरिएबल बनाना बस इस तरह किया जाता है
लूप लिखना और वेरिएबल्स का उपयोग करना अधिक जटिल फाइल हेरफेर का रास्ता खोलता है और शेल स्क्रिप्टिंग का प्रवेशद्वार है, जो इस परिचयात्मक लेख के दायरे से परे है। हालाँकि, यदि आप छोटा शुरू करते हैं और जैसे-जैसे आत्मविश्वास बढ़ता है सुधार करते जाते हैं, तो शेल स्क्रिप्टिंग पर्याप्त रूप से सरल है।
निष्कर्ष
डेटा वैज्ञानिकों के रूप में आपके दैनिक कार्य में शेल कमांड लाइनें अत्यंत उपयोगी हैं। और भी कई उदाहरण और उपयोग मामलों का अन्वेषण किया जा सकता है। और जैसा कि आप देखेंगे, किसी विशेष परिणाम को प्राप्त करने के अक्सर अलग-अलग तरीके होते हैं, जो उपलब्ध शेल कमांड्स और संबंधित फ्लैग्स की विस्तृत शृंखला का उपयोग करते हैं। ऐसे में, चीजों को सरल रखना हमेशा विजयी रणनीति है।
आशा है कि यहाँ प्रस्तुत उदाहरण आपको अपने डेटा प्रोसेसिंग टूलकिट में शेल कमांड्स को शामिल करने में मदद करेंगे। निःसंकोच संपर्क करें और अपने शेल ट्रिक्स ट्विटर पर साझा करें: @alexip।
ऐसी कई स्थितियाँ होती हैं जहाँ आपको संख्या और आकार दोनों में बड़े फाइलों का त्वरित विश्लेषण, संशोधन और प्रोसेसिंग करनी पड़ती है। अक्सर ये फाइलें टेक्स्ट-आधारित Comma Separated Values (CSV) फाइलें होती हैं। Excel, LibreOffice या OpenOffice जैसे सामान्य स्प्रेडशीट अनुप्रयोगों से उन्हें खोलना मशीन की मेमोरी पर भार डाल देता है। साथ ही, कई फाइलों को एक बैच में प्रोसेस करना अक्सर कुछ घंटों बाद किसी अनपेक्षित फाइल विसंगति के कारण विफल हो जाता है।
नतीजतन, आपका बहुत समय फ्रीज़ हुई स्क्रीन, रिस्टार्ट और लंबा इंतज़ार करने में बीतता है।
हालाँकि, इन कार्यों में से अधिकांश कुछ पंक्तियों के कोड से किए जा सकते हैं। इससे भी बढ़कर, कुछ सरल शेल कमांड लाइनों की परिचितता समय बचाने और झुंझलाहट घटाने में बहुत सहायक हो सकती है।
यह पोस्ट उन कुछ शेल कमांड्स का अवलोकन देगी जिन्हें मैं लगभग हर दिन उपयोग करता हूँ। आशा है ये आपके काम आएँगे।
त्वरित नोट्स
ध्यान दें कि अलग-अलग प्रकार के शेल (bash, zsh, ...) होते हैं, जिनमें bash सबसे सामान्य है क्योंकि यह OS X और प्रमुख linux डिस्ट्रीब्यूशनों पर डिफ़ॉल्ट शेल है। Zsh (और Oh My Zsh) एक लोकप्रिय और शक्तिशाली विकल्प है। इस ब्लॉग पोस्ट में दिए गए शेल कमांड OS X (macOS) पर bash में परखे गए हैं और अन्य शेल्स व वातावरणों में भी काम करने चाहिए।
आगे दिए गए सभी उदाहरण UCI Machine Learning रिपॉज़िटरी के adult डेटासेट पर आधारित हैं जिसे "Census Income" डेटासेट भी कहा जाता है, और यहाँ उपलब्ध है। यह डेटा सेट आम तौर पर जनगणना डेटा के आधार पर यह भविष्यवाणी करने के लिए इस्तेमाल होता है कि आय \$50K/वर्ष से अधिक है या नहीं। 48842 पंक्तियों और 14 विशेषताओं के साथ, यह बहुत बड़ा डेटासेट नहीं है पर उदाहरणों को समझाने के लिए पर्याप्त है। यद्यपि डेटा
.dataएक्सटेंशन के साथ संग्रहीत है, यह एक सुव्यवस्थित CSV फाइल है। साथ चलने के लिए डेटासेट डाउनलोड करने में संकोच न करें!गिनती करें
wcके साथकिसी नई टेक्स्ट-आधारित फाइल के लिए, आप जानना चाहेंगे कि उसमें कितनी पंक्तियाँ हैं। यह word count
wc -lकमांड से किया जा सकता है:यह बताता है कि
adult.dataफाइल में 32562 पंक्तियाँ हैं।-lफ्लैगwcको लाइनों की गिनती करने को कहता है। लेकिन आपwcका उपयोग शब्दों की गिनती के लिए भी-wफ्लैग के साथ कर सकते हैं।adult.dataफाइल में लगभग 500k शब्द हैं।wcकमांड किसी डायरेक्टरी में फाइलों की संख्या भी गिन सकता है, यदि आप साधारणls -lकमांड के आउटपुट कोwcके इनपुट के रूप में दें। किसी कमांड के आउटपुट को पाइप प्रतीक|के जरिए दूसरी कमांड के इनपुट के रूप में देना एक उपयोगी शेल पैटर्न है जिसे pipelining कहा जाता है। आप इसे इस पोस्ट के कई उदाहरणों में देखेंगे।मान लें अब आपके पास बहुत सारी फाइलों वाला एक फोल्डर है। निम्न कमांड आपको ठीक-ठीक बताएगी कि उसमें कितनी फाइलें हैं:
यदि आप वाइल्डकार्ड्स और सबफोल्डर्स जोड़ना शुरू करें तो
wcके और भी कई उपयोग हैं।अब वापस अपनी
adult.dataफाइल पर लौटते हैं औरheadकमांड से शुरुआती पंक्तियाँ देखते हैं। डिफ़ॉल्ट रूप से,head10 पंक्तियाँ आउटपुट करता है; आप-nफ्लैग का उपयोग करके आउटपुट को पहले 2 पंक्तियों तक सीमित कर सकते हैं।और आप देखते हैं कि फाइल में हेडर पंक्ति नहीं है। कॉलम के नाम फाइल में मौजूद नहीं हैं। आप
catकमांड का उपयोग करके दो फाइलों को जोड़कर वह हेडर पंक्ति जोड़ सकते हैं।फाइलें जोड़ें
catके साथcatकमांड किसी फाइल की सामग्री को स्टैंडर्ड आउटपुट (यानी आपका टर्मिनल) पर प्रिंट करता है। इसे फाइलों की एक शृंखला को जोड़ने के लिए भी इस्तेमाल किया जा सकता है। कमांडcat file_1.csv file_2.csv > target_file.csvfile_1.csvऔरfile_2.csvदोनों की सामग्री कोtarget_file.csvमें मर्ज कर देगा, जिसमेंfile_2.csvकी सामग्रीfile_1.csvके अंत में जोड़ दी जाएगी।हेडर फाइल मूल डेटासेट में नहीं है और आपको इसे बनाना होगा। ऐसा करने के लिए, आप कॉलम नामों की कॉमा-सेपरेटेड सूची को
header.csvफाइल मेंechoकरते हैं।इस उदाहरण में, आपने शेल रिडायरेक्शन
>कैरेक्टर का उपयोगcatके आउटपुट कोadult.csvफाइल में डंप करने के लिए किया। यदि फाइल मौजूद नहीं है तो>फाइल बना देगा, और यदि फाइल पहले से मौजूद है तो उसकी सामग्री को पूरी तरह बदल देगा। प्रतीक को दोगुना करना>>नई सामग्री को किसी मौजूदा फाइल के अंत में जोड़ देगा बिना उसकी वर्तमान सामग्री मिटाए।अब
header.csvफाइल कोadult.dataफाइल की शुरुआत में जोड़ते हैं। साथ ही, आपadult.dataका नाम बदलकरadult.csvरख देते हैं क्योंकि, आखिरकार, यह CSV फ़ॉर्मैटेड फाइल है।जाँचें कि
adult.csvकी पहली पंक्ति में कॉलम नाम हैं:फाइल संशोधित करें
sedके साथएक और सामान्य डेटा माइनिंग स्थिति तब आती है जब कोई फाइल भ्रष्ट या गलत फॉर्मैट में होती है, जैसे गैर-UTF-8 कैरेक्टर्स या गलत जगह पर लगा कॉमा। आप
sedकमांड का उपयोग करके बिना फाइल खोले ही उसे सही कर सकते हैं।जनरिक
sedपैटर्न हैadult.csvडेटासेट में गुम मानों के लिए?कैरेक्टर का उपयोग किया गया है। आपsedका उपयोग करके उस कैरेक्टर को बेहतर डिफ़ॉल्ट मान से बदल सकते हैं। खाली स्ट्रिंग गुम मान के संकेत के रूप में बेहतर है क्योंकि Pandas DataFrame में डेटा लोड करते समय इसेNaNके रूप में इंटरप्रेट किया जाएगा।यह आपको उन 2399 पंक्तियों की गिनती देता है जिनमें कम से कम एक कॉलम में
?से दर्शाया गया गुम मान है। निम्न कमांड सभी?वाले कॉलमों को खाली स्ट्रिंग से बदल देगी। वे सभी सेल जिनमें केवल?है और उसके बाद एक स्पेस है, अब वास्तव में खाली होंगे।ध्यान दें कि आपने स्रोत और लक्ष्य स्ट्रिंग्स में कॉलम डिलिमिटर
,का उपयोग किया है ताकि डेटासेट के अन्य हिस्सों में मौजूद वास्तविक प्रश्नवाचक चिह्नों को बदलने से बचा जा सके।बड़ी फाइल का सबसेट बनाना
मान लें अब आप 3 करोड़ से अधिक पंक्तियों वाली फाइल से निपट रहे हैं। जब आप अपना Python या R स्क्रिप्ट बनाते हैं, तो आप अपने वर्कफ़्लो को पूरे डेटासेट को मेमोरी में लोड किए बिना, मूल बड़ी फाइल के केवल एक सैंपल पर परीक्षण करना चाहेंगे। आप
headऔरtailके संयोजन का उपयोग करके मूल डेटासेट का एक उपनमूना बना सकते हैं।headफाइलों के शुरुआती हिस्से को आउटपुट करता है;tailफाइलों के अंतिम हिस्से को आउटपुट करता हैजैसा आपने पहले देखा, ये कमांड्स
-nफ्लैग लेते हैं, जो--linesके लिए है, और आउटपुट में पंक्तियों की संख्या को सीमित करता है।tail-fफ्लैग भी लेता है जहाँf--followके लिए है, जो फाइल के अंत में पंक्तियाँ जुड़ते ही जुड़े हुए डेटा को आउटपुट करता है। यह विशेष रूप से तब सुविधाजनक है जब आपके स्क्रिप्ट चलते समय आपtail -f <logfile>से लॉग फाइलों की निगरानी करते हैं।पाइप प्रतीक
|कोheadऔरtailके साथ मिलाकर, आप स्रोत फाइल के भीतर से निश्चित संख्या में पंक्तियाँ निकाल सकते हैं और सामग्री को एक सबसेट फाइल में एक्सपोर्ट कर सकते हैं। उदाहरण के लिए, पंक्ति 100 से शुरू होकर 20 पंक्तियाँ निकालने के लिए:ध्यान दें कि आप पहले
headके साथ first_line + number_of_lines लेते हैं और फिरtailके साथ number_of_lines लेते हैं। जनरिक सबसेटिंग कमांड है:जहाँ
total_lines = first_line + number_of_lines। हालाँकि, आपकी नई सैंपल्ड फाइल में अब हेडर पंक्ति नहीं है। हम पहले से जानते हैं कि सबसेट फाइल मेंheader.csvफाइल को जोड़करcatका उपयोग करके हेडर कैसे वापस जोड़ें:ध्यान दें कि आपने स्रोत फाइलनाम
adult\_sample.csvको लक्ष्य फाइलनाम के रूप में उपयोग नहीं किया, बल्कि इसके बजायadult\_sample\_with\_header.csvनामक नई फाइल बनाई।catका उपयोग करते समय स्रोतों में से किसी एक के समान नाम को लक्ष्य के रूप में रखने से अप्रत्याशित फाइल सामग्री प्राप्त होगी। बेहतर है किcatकमांड के आउटपुट के रूप में नई फाइल बनाई जाए।डुप्लिकेट ढूँढना
uniqके साथuniqकमांड के साथ आप किसी फाइल में एक-दूसरे से सटी हुई दोहराई गई पंक्तियाँ खोज सकते हैं।uniqकई फ्लैग लेता है, जिनमें अधिक उपयोगी हैं:uniq -c: प्रत्येक पंक्ति में पुनरावृत्ति की गिनती जोड़ता है;uniq -d: केवल डुप्लिकेट पंक्तियाँ आउटपुट करता है; औरuniq -u: केवल यूनिक पंक्तियाँ आउटपुट करता है।हालाँकि,
uniqकोई स्मार्ट कमांड नहीं है। यदि दोहराई गई पंक्तियाँ एक-दूसरे के पास नहीं हैं तो उनका पता नहीं चलेगा। इसका मतलब है कि आपको पहले फाइल कोsortकरना होगा। यह कमांडadult.csvमें डुप्लिकेट पंक्तियों की संख्या गिनती है।और दिखाता है कि वहाँ 23 डुप्लिकेट हैं। अगला कमांड सभी पंक्तियों के आउटपुट को पुनरावृत्ति गिनती सहित लेता है, उल्टे क्रम में सॉर्ट करता है और पहली 3 डुप्लिकेट पंक्तियाँ आउटपुट करता है:
sortऔरuniqको अलग-अलग फ्लैग्स के साथ मिलाकर कई शक्तिशाली विकल्प प्राप्त किए जा सकते हैं। इन कमांड्स को आगे एक्सप्लोर करने के लिएman sortऔरman uniqका उपयोग करें।कॉलम चुनना
cutके साथCSV फाइलों और शेल कमांड्स की अच्छी बात यह है कि आप
cutका उपयोग करके किसी विशेष कॉलम का चयन कर कॉलम स्तर पर भी काम कर सकते हैं।cutदो मुख्य फ्लैग लेता है: कॉलम डिलिमिटर निर्दिष्ट करने के लिए-dऔर जिन कॉलमों पर काम करना है उन्हें निर्दिष्ट करने के लिए-f। निम्न उदाहरण में, आपcutका उपयोग श्रेणीगत चरworkclass(कॉलम 2) द्वारा लिए गए यूनिक मानों की संख्या पता करने के लिए करते हैं।पहले
workclassकॉलम चुनें और सही कॉलम है यह सत्यापित करने के लिए आउटपुट को head में पाइप करें:अब, यूनिक की गिनती के लिए, आप cut के आउटपुट को sort करते हैं और परिणाम को
uniq -cमें पाइप करते हैं, इस प्रकार:जो आपको बताता है, उदाहरण के लिए, कि आपके पास 1837 null मान हैं, और मुख्य श्रेणी काफी अंतर से
Privateहै, जिसकी 22969 आवृत्तियाँ हैं।ऊपर दी गई कमांड लाइन
value_counts()मेथड के समान है, जब इसेadult.csvडेटा वाले DataFrame पर लागू किया जाता है।लूपिंग
अब तक, आपने ज्यादातर एक फाइल पर काम किया है। बड़ी संख्या में फाइलों का नाम बदलने, प्रोसेस करने या ट्रांसफर करने के लिए, आपको अपनी शेल टूलकिट में लूप जोड़ना चाहिए। bash शेल में लूप का जनरिक फ़ॉर्मैट है:
इसे काम में लेते हैं। मान लें आपके पास 1000 फाइलें हैं जिनके फाइलनाम में स्पेस हैं और आप प्रत्येक स्पेस को अंडरस्कोर "_" से बदलना चाहते हैं।
इस उदाहरण में,
replace_sourceऔरreplace_targetक्रमशः स्पेस और अंडरस्कोर कैरेक्टर्स के प्लेसहोल्डर के रूप में*.csvफाइलों पर लूप लगाते हैंfilenameके लिए, आप हर स्पेस को अंडरस्कोर से बदलकर एकnew_filenameबनाते हैंmvकमांड के साथ वर्तमान फाइलनाम से नए फाइलनाम पर फाइल का नाम बदल देते हैंवास्तव में, आपने न केवल किसी डायरेक्टरी में फाइलों पर लूप लगाया, बल्कि वेरिएबल्स भी बनाए।
वेरिएबल्स
आप शेल कमांड की इस भूमिका का अंत वेरिएबल्स के साथ करेंगे। शेल में वेरिएबल बनाना बस इस तरह किया जाता है
उदाहरण के लिए:
ध्यान दें कि '=' चिन्ह के आस-पास कोई स्पेस नहीं होता।
var = '<a string>'काम नहीं करेगा। वेरिएबल का मान वापस पाने के लिए, बस इसेechoकरें:और स्क्रिप्ट में उपयोग करने के लिए, जैसा आपने पहले देखा, इसे कोट्स में समाहित करें:
लूप लिखना और वेरिएबल्स का उपयोग करना अधिक जटिल फाइल हेरफेर का रास्ता खोलता है और शेल स्क्रिप्टिंग का प्रवेशद्वार है, जो इस परिचयात्मक लेख के दायरे से परे है। हालाँकि, यदि आप छोटा शुरू करते हैं और जैसे-जैसे आत्मविश्वास बढ़ता है सुधार करते जाते हैं, तो शेल स्क्रिप्टिंग पर्याप्त रूप से सरल है।
निष्कर्ष
डेटा वैज्ञानिकों के रूप में आपके दैनिक कार्य में शेल कमांड लाइनें अत्यंत उपयोगी हैं। और भी कई उदाहरण और उपयोग मामलों का अन्वेषण किया जा सकता है। और जैसा कि आप देखेंगे, किसी विशेष परिणाम को प्राप्त करने के अक्सर अलग-अलग तरीके होते हैं, जो उपलब्ध शेल कमांड्स और संबंधित फ्लैग्स की विस्तृत शृंखला का उपयोग करते हैं। ऐसे में, चीजों को सरल रखना हमेशा विजयी रणनीति है।
आशा है कि यहाँ प्रस्तुत उदाहरण आपको अपने डेटा प्रोसेसिंग टूलकिट में शेल कमांड्स को शामिल करने में मदद करेंगे। निःसंकोच संपर्क करें और अपने शेल ट्रिक्स ट्विटर पर साझा करें: @alexip।
हमारा अपने कंप्यूटर पर डेटा साइंस एनवायरनमेंट सेटअप करें ट्यूटोरियल देखें।