टेक्स्ट फ़ाइल से लाइनें पढ़ना और प्रत्येक लाइन पर प्रत्येक नाम के लिए एक टेक्स्ट फ़ाइल बनाना


21

मान लीजिए कि मेरे पास एक टेक्स्ट फाइल है जैसे:

john
george
james
stewert

एक अलग लाइन पर हर नाम के साथ।

मैं इस पाठ फ़ाइल की तर्ज पढ़ सकते हैं और तरह प्रत्येक नाम के लिए एक पाठ फ़ाइल बनाने के लिए, चाहते हैं: john.txt, george.txtआदि

मैं इसे बाश में कैसे कर सकता हूं?


2
क्या आपको विस्तार की आवश्यकता है? पाठ फ़ाइलों के लिनक्स में एक txt एक्सटेंशन होने का कोई कारण नहीं है।
टेराडो

जवाबों:


18

# 1 बैश + का उपयोग करना touch:

while read line; do touch "$line.txt"; done <in
  • while read line; [...]; done <in: यह स्वयं लौटने readतक चलता readहै 1, जो तब होता है जब फ़ाइल के अंत तक पहुँच जाता है; इनपुट को रीडायरेक्शन के कारण टर्मिनल के बजाय वर्तमान कार्यशील निर्देशिका में readनामित फ़ाइल से पढ़ा जाता है;in<in
  • touch "$line.txt": यह touchविस्तारित मूल्य पर चलता है $line.txt, जो lineइसके बाद की सामग्री है .txt; touchयदि मौजूदा नहीं है तो फ़ाइल बनाएंगे और यदि मौजूद है तो उसका एक्सेस समय अपडेट करेंगे;

# 2 xargs+ का उपयोग करना touch:

xargs -a in -I name touch name.txt
  • -a in: वर्तमान कार्य निर्देशिका में xargsनामित फ़ाइल से इसके इनपुट को पढ़ता है in;
  • -I name: निम्न कमांड में इनपुट की वर्तमान लाइन के साथ xargsहर घटना को प्रतिस्थापित करता है name;
  • touch name: touchके बदले हुए मूल्य पर चलता है name; यदि मौजूदा नहीं है तो यह फाइल बनाएगा और यदि मौजूदा समय में इसका उपयोग समय अपडेट करेगा;
% ls
in
% cat in
john
george
james
stewert
% while read line; do touch "$line.txt"; done <in
% ls
george.txt  in  james.txt  john.txt  stewert.txt
% rm *.txt
% xargs -a in -I name touch name.txt
% ls
george.txt  in  james.txt  john.txt  stewert.txt

read lineवास्तव में लाइन कैसे पढ़ेगी? @kos
कशिश

@kashish <inके बाद doneबनाता readमें whileपाश हालत पढ़ सकते हैं और से एक लाइन की दुकान inमें lineप्रत्येक यात्रा पर; इस तरह, touch "$line.txt"लूप के अंदर .txtअंत में रीड लाइन तक विस्तार किया जाएगा।
कोस

होगा while read line; do touch "$line.txt"; done <inअकेले काम करते हैं? स्रोत फ़ाइल कहाँ है?
कशिश

@ पक्का यकीन है, वे वैकल्पिक तरीके हैं: आप एक या दूसरे का उपयोग करने के लिए हैं।
कोस

1
@ readकाम है कि कैसे काम करता है। देखते हैं help read
टेर्डन

18

इस विशेष मामले में, जहाँ आपके पास प्रति पंक्ति केवल एक शब्द है, आप यह भी कर सकते हैं:

xargs touch < file

ध्यान दें कि यह टूट जाएगा यदि आपकी फ़ाइल नामों में स्थान हो सकते हैं। ऐसे मामलों के लिए, इसके बजाय इसका उपयोग करें:

xargs -I {} touch {} < file

बस मनोरंजन के लिए, यहां कुछ अन्य दृष्टिकोण हैं (दोनों जिनमें से रिक्त स्थान के साथ लाइनों सहित मनमाने ढंग से फ़ाइल नाम संभाल सकते हैं):

  • पर्ल

    perl -ne '`touch "$_"`' file
  • awk

    awk '{printf "" > $0}' file 

ध्यान दें कि लिनक्स और इसी तरह की प्रणालियों पर, एक्सटेंशन विशाल बहुमत फ़ाइलों के लिए वैकल्पिक है। .txtटेक्स्ट फ़ाइल में एक्सटेंशन जोड़ने का कोई कारण नहीं है । आप ऐसा करने के लिए स्वतंत्र हैं लेकिन इससे कोई फर्क नहीं पड़ता। इसलिए, यदि आप किसी भी तरह से एक्सटेंशन चाहते हैं, तो निम्न में से एक का उपयोग करें:

xargs -I {} touch {}.txt < file
perl -ne '`touch "$_.txt"`' file
awk '{printf "" > $0".txt"}' file 

7

AWK इस कार्य के लिए भी उपयुक्त है:

testerdir:$ awk '{system("touch "$0)}' filelist

testerdir:$ ls
filelist  george  james  john  stewert

testerdir:$ awk '{system("touch "$0".txt")}' filelist                          

testerdir:$ ls
filelist  george.txt  james.txt  john.txt  stewert.txt
george    james       john       stewert

एक और तरीका है, tee। ध्यान दें कि यदि लाइन लाइनिस्ट में एक से अधिक तार होते हैं तो यह दृष्टिकोण टूट जाएगा।

testerdir:$ echo "" | tee $(cat filelist)


testerdir:$ ls
filelist  george  james  john  stewert

वैकल्पिक रूप से, </dev/null tee $(cat filelist)साथ ही किया जा सकता है, यदि आप पाइपिंग से बचना चाहते हैं

cp /dev/null दृष्टिकोण (जैसा कि मैं प्रदर्शित करता हूं कि इसमें ऐसे फ़ाइलनामों के साथ काम किया जाता है जिनमें रिक्त स्थान होते हैं):

testerdir:$ cat filelist | xargs -I {}  cp /dev/null  "{}"                     

testerdir:$ ls
filelist  FILE WITH SPACES  george  james  john  stewert

testerdir:$ ls FILE\ WITH\ SPACES                                              
FILE WITH SPACES

1
@kos यदि फ़ाइल में प्रत्येक पंक्ति में प्रति पंक्ति एक स्ट्रिंग है, तो यह प्रति पंक्ति एक फ़ाइल बनाता है। यह समान रूप से प्रभावी है echo "" | tee file1 file2 file2। लेकिन यह टूटता है अगर फ़ाइलनाम में रिक्त स्थान होते हैं।
सर्गी कोलोडियाज़नी

7

मान लीजिए कि मेरे पास एक पाठ फ़ाइल है ...

आइए बताते हैं, मेरे पास एक जवाब है ;)

awk '{system("touch \""$0".txt\"")}' file

पनरोक भी रिक्त स्थान के साथ और एक प्रत्यय के साथ =)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.