मुख्य सामग्री पर जाएं

डेटा साइंस के लिए 8 उपयोगी शेल कमांड

डेटा वैज्ञानिक लगभग हर दिन कौन से शेल कमांड उपयोग करते हैं? इस ट्यूटोरियल में उन्हें खोजें और उपयोग करना सीखें!
अपडेट किया गया 25 सित॰ 2026  · 12 मि॰ पढ़ें

AI के साथ खोजें

ChatGPTClaudePerplexity

ऐसी कई स्थितियाँ होती हैं जहाँ आपको संख्या और आकार दोनों में बड़े फाइलों का त्वरित विश्लेषण, संशोधन और प्रोसेसिंग करनी पड़ती है। अक्सर ये फाइलें टेक्स्ट-आधारित 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 कमांड से किया जा सकता है:

$ wc -l adult.data
  32562 adult.data

यह बताता है कि adult.data फाइल में 32562 पंक्तियाँ हैं। -l फ्लैग wc को लाइनों की गिनती करने को कहता है। लेकिन आप wc का उपयोग शब्दों की गिनती के लिए भी -w फ्लैग के साथ कर सकते हैं।

$ wc -w adult.data
  488415 adult.data

adult.data फाइल में लगभग 500k शब्द हैं।

wc कमांड किसी डायरेक्टरी में फाइलों की संख्या भी गिन सकता है, यदि आप साधारण ls -l कमांड के आउटपुट को wc के इनपुट के रूप में दें। किसी कमांड के आउटपुट को पाइप प्रतीक | के जरिए दूसरी कमांड के इनपुट के रूप में देना एक उपयोगी शेल पैटर्न है जिसे pipelining कहा जाता है। आप इसे इस पोस्ट के कई उदाहरणों में देखेंगे।

मान लें अब आपके पास बहुत सारी फाइलों वाला एक फोल्डर है। निम्न कमांड आपको ठीक-ठीक बताएगी कि उसमें कितनी फाइलें हैं:

$ ls -l <folder> | wc -l
 508

यदि आप वाइल्डकार्ड्स और सबफोल्डर्स जोड़ना शुरू करें तो wc के और भी कई उपयोग हैं।

अब वापस अपनी adult.data फाइल पर लौटते हैं और head कमांड से शुरुआती पंक्तियाँ देखते हैं। डिफ़ॉल्ट रूप से, head 10 पंक्तियाँ आउटपुट करता है; आप -n फ्लैग का उपयोग करके आउटपुट को पहले 2 पंक्तियों तक सीमित कर सकते हैं।

$ head -n 2 adult.data
39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K

और आप देखते हैं कि फाइल में हेडर पंक्ति नहीं है। कॉलम के नाम फाइल में मौजूद नहीं हैं। आप cat कमांड का उपयोग करके दो फाइलों को जोड़कर वह हेडर पंक्ति जोड़ सकते हैं।

फाइलें जोड़ें cat के साथ

cat कमांड किसी फाइल की सामग्री को स्टैंडर्ड आउटपुट (यानी आपका टर्मिनल) पर प्रिंट करता है। इसे फाइलों की एक शृंखला को जोड़ने के लिए भी इस्तेमाल किया जा सकता है। कमांड cat file_1.csv file_2.csv > target_file.csv file_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 फ़ॉर्मैटेड फाइल है।

$ cat header.csv adult.data > adult.csv

जाँचें कि adult.csv की पहली पंक्ति में कॉलम नाम हैं:

$ head -n 1 adult.csv
age,workclass,fnlwgt,education,education-num,marital-status,occupation,relationship,race,sex,capital-gain,capital-loss,native-country,class
39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K

फाइल संशोधित करें sed के साथ

एक और सामान्य डेटा माइनिंग स्थिति तब आती है जब कोई फाइल भ्रष्ट या गलत फॉर्मैट में होती है, जैसे गैर-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 के रूप में इंटरप्रेट किया जाएगा।

$ grep ", ?," adult.csv | wc -l
2399

यह आपको उन 2399 पंक्तियों की गिनती देता है जिनमें कम से कम एक कॉलम में ? से दर्शाया गया गुम मान है। निम्न कमांड सभी ? वाले कॉलमों को खाली स्ट्रिंग से बदल देगी। वे सभी सेल जिनमें केवल ? है और उसके बाद एक स्पेस है, अब वास्तव में खाली होंगे।

$ sed "s/, ?,/,,/g" adult.csv >  adult.csv

ध्यान दें कि आपने स्रोत और लक्ष्य स्ट्रिंग्स में कॉलम डिलिमिटर , का उपयोग किया है ताकि डेटासेट के अन्य हिस्सों में मौजूद वास्तविक प्रश्नवाचक चिह्नों को बदलने से बचा जा सके।

बड़ी फाइल का सबसेट बनाना

मान लें अब आप 3 करोड़ से अधिक पंक्तियों वाली फाइल से निपट रहे हैं। जब आप अपना Python या R स्क्रिप्ट बनाते हैं, तो आप अपने वर्कफ़्लो को पूरे डेटासेट को मेमोरी में लोड किए बिना, मूल बड़ी फाइल के केवल एक सैंपल पर परीक्षण करना चाहेंगे। आप head और tail के संयोजन का उपयोग करके मूल डेटासेट का एक उपनमूना बना सकते हैं।

  • head फाइलों के शुरुआती हिस्से को आउटपुट करता है;
  • tail फाइलों के अंतिम हिस्से को आउटपुट करता है

जैसा आपने पहले देखा, ये कमांड्स -n फ्लैग लेते हैं, जो --lines के लिए है, और आउटपुट में पंक्तियों की संख्या को सीमित करता है। tail -f फ्लैग भी लेता है जहाँ f --follow के लिए है, जो फाइल के अंत में पंक्तियाँ जुड़ते ही जुड़े हुए डेटा को आउटपुट करता है। यह विशेष रूप से तब सुविधाजनक है जब आपके स्क्रिप्ट चलते समय आप tail -f <logfile> से लॉग फाइलों की निगरानी करते हैं।

पाइप प्रतीक | को head और tail के साथ मिलाकर, आप स्रोत फाइल के भीतर से निश्चित संख्या में पंक्तियाँ निकाल सकते हैं और सामग्री को एक सबसेट फाइल में एक्सपोर्ट कर सकते हैं। उदाहरण के लिए, पंक्ति 100 से शुरू होकर 20 पंक्तियाँ निकालने के लिए:

$ head -n 120 adult.csv | tail -n 20 > 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 में डुप्लिकेट पंक्तियों की संख्या गिनती है।

$ sort adult.csv | uniq -d | wc -l
23

और दिखाता है कि वहाँ 23 डुप्लिकेट हैं। अगला कमांड सभी पंक्तियों के आउटपुट को पुनरावृत्ति गिनती सहित लेता है, उल्टे क्रम में सॉर्ट करता है और पहली 3 डुप्लिकेट पंक्तियाँ आउटपुट करता है:

$ sort adult.csv | uniq -c | sort -r | head -n 3
3 25, Private, 195994, 1st-4th, 2, Never-married, ...
2 90, Private, 52386, Some-college, 10, Never-married, ...
2 49, Self-emp-not-inc, 43479, Some-college, 10, Married-civ-spouse, ...

sort और uniq को अलग-अलग फ्लैग्स के साथ मिलाकर कई शक्तिशाली विकल्प प्राप्त किए जा सकते हैं। इन कमांड्स को आगे एक्सप्लोर करने के लिए man sort और man uniq का उपयोग करें।

कॉलम चुनना cut के साथ

CSV फाइलों और शेल कमांड्स की अच्छी बात यह है कि आप cut का उपयोग करके किसी विशेष कॉलम का चयन कर कॉलम स्तर पर भी काम कर सकते हैं। cut दो मुख्य फ्लैग लेता है: कॉलम डिलिमिटर निर्दिष्ट करने के लिए -d और जिन कॉलमों पर काम करना है उन्हें निर्दिष्ट करने के लिए -f। निम्न उदाहरण में, आप cut का उपयोग श्रेणीगत चर workclass (कॉलम 2) द्वारा लिए गए यूनिक मानों की संख्या पता करने के लिए करते हैं।

पहले workclass कॉलम चुनें और सही कॉलम है यह सत्यापित करने के लिए आउटपुट को head में पाइप करें:

$ cut -d "," -f 2 adult.csv | head -3
workclass
State-gov
Self-emp-not-inc

अब, यूनिक की गिनती के लिए, आप cut के आउटपुट को sort करते हैं और परिणाम को uniq -c में पाइप करते हैं, इस प्रकार:

$  cut -d "," -f 2 adult.csv | sort | uniq -c
1837
 960  Federal-gov
2093  Local-gov
   7  Never-worked
22696  Private
1116  Self-emp-inc
2541  Self-emp-not-inc
1298  State-gov
  14  Without-pay
   1 workclass

जो आपको बताता है, उदाहरण के लिए, कि आपके पास 1837 null मान हैं, और मुख्य श्रेणी काफी अंतर से Private है, जिसकी 22969 आवृत्तियाँ हैं।

ऊपर दी गई कमांड लाइन value_counts() मेथड के समान है, जब इसे adult.csv डेटा वाले DataFrame पर लागू किया जाता है।

लूपिंग

अब तक, आपने ज्यादातर एक फाइल पर काम किया है। बड़ी संख्या में फाइलों का नाम बदलने, प्रोसेस करने या ट्रांसफर करने के लिए, आपको अपनी शेल टूलकिट में लूप जोड़ना चाहिए। bash शेल में लूप का जनरिक फ़ॉर्मैट है:

while true; do
    _do something_ ;
done

इसे काम में लेते हैं। मान लें आपके पास 1000 फाइलें हैं जिनके फाइलनाम में स्पेस हैं और आप प्रत्येक स्पेस को अंडरस्कोर "_" से बदलना चाहते हैं।

replace_source=' '
replace_target='_'
for filename in ./*.csv; do
    new_filename=${filename//$replace_source/$replace_target}
    mv "$filename" "$new_filename"
done

इस उदाहरण में,

  • आप पहले दो वेरिएबल घोषित करते हैं: replace_source और replace_target क्रमशः स्पेस और अंडरस्कोर कैरेक्टर्स के प्लेसहोल्डर के रूप में
  • आप वर्तमान फोल्डर में सभी *.csv फाइलों पर लूप लगाते हैं
  • प्रत्येक filename के लिए, आप हर स्पेस को अंडरस्कोर से बदलकर एक new_filename बनाते हैं
  • और आप mv कमांड के साथ वर्तमान फाइलनाम से नए फाइलनाम पर फाइल का नाम बदल देते हैं

वास्तव में, आपने न केवल किसी डायरेक्टरी में फाइलों पर लूप लगाया, बल्कि वेरिएबल्स भी बनाए।

वेरिएबल्स

आप शेल कमांड की इस भूमिका का अंत वेरिएबल्स के साथ करेंगे। शेल में वेरिएबल बनाना बस इस तरह किया जाता है

$ varname='<a string>'
$ varname=a number

उदाहरण के लिए:

$ varname='Hello world'
$ varname=123.4

ध्यान दें कि '=' चिन्ह के आस-पास कोई स्पेस नहीं होता। var = '<a string>' काम नहीं करेगा। वेरिएबल का मान वापस पाने के लिए, बस इसे echo करें:

$ echo $varname
123.4

और स्क्रिप्ट में उपयोग करने के लिए, जैसा आपने पहले देखा, इसे कोट्स में समाहित करें:

$ mv "$filename" "$new_filename"

लूप लिखना और वेरिएबल्स का उपयोग करना अधिक जटिल फाइल हेरफेर का रास्ता खोलता है और शेल स्क्रिप्टिंग का प्रवेशद्वार है, जो इस परिचयात्मक लेख के दायरे से परे है। हालाँकि, यदि आप छोटा शुरू करते हैं और जैसे-जैसे आत्मविश्वास बढ़ता है सुधार करते जाते हैं, तो शेल स्क्रिप्टिंग पर्याप्त रूप से सरल है।

निष्कर्ष

डेटा वैज्ञानिकों के रूप में आपके दैनिक कार्य में शेल कमांड लाइनें अत्यंत उपयोगी हैं। और भी कई उदाहरण और उपयोग मामलों का अन्वेषण किया जा सकता है। और जैसा कि आप देखेंगे, किसी विशेष परिणाम को प्राप्त करने के अक्सर अलग-अलग तरीके होते हैं, जो उपलब्ध शेल कमांड्स और संबंधित फ्लैग्स की विस्तृत शृंखला का उपयोग करते हैं। ऐसे में, चीजों को सरल रखना हमेशा विजयी रणनीति है।

आशा है कि यहाँ प्रस्तुत उदाहरण आपको अपने डेटा प्रोसेसिंग टूलकिट में शेल कमांड्स को शामिल करने में मदद करेंगे। निःसंकोच संपर्क करें और अपने शेल ट्रिक्स ट्विटर पर साझा करें: @alexip।

हमारा अपने कंप्यूटर पर डेटा साइंस एनवायरनमेंट सेटअप करें ट्यूटोरियल देखें।

विषय
डेटा साइंस

डेटा साइंस कोर्स

कोर्स

डेटा साइंस को समझना

2 घंटा
875.2K
बिना कोडिंग के डेटा विज्ञान का परिचय।
विवरण देखेंRight Arrow
पाठ्यक्रम शुरू करें
और देखेंRight Arrow