একটি পাঠ্য ফাইল থেকে লাইনগুলি পড়া এবং প্রতিটি লাইনে প্রতিটি নামের জন্য একটি পাঠ্য ফাইল তৈরি করা


21

ধরা যাক আমার কাছে একটি টেক্সট ফাইল রয়েছে:

john
george
james
stewert

পৃথক লাইনে প্রতিটি নামের সাথে।

আমি এই টেক্সট ফাইল লাইনের পড়া এবং মত প্রতিটি নামের জন্য একটি টেক্সট ফাইল তৈরি করুন, করতে চাই: john.txt, george.txtইত্যাদি

বাশে আমি কীভাবে এটি করতে পারি?


2
আপনার কি এক্সটেনশন দরকার? লিনাক্সে টেক্সট ফাইলগুলির একটি টেক্সট এক্সটেনশন হওয়ার কোনও কারণ নেই।
টেরডন

উত্তর:


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আসলে লাইনটি কীভাবে পড়বে ? @ কোস
কাশিশ

@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 

নোট করুন যে লিনাক্স এবং অনুরূপ সিস্টেমে এক্সটেনশনটি ফাইলের সিংহভাগের জন্য alচ্ছিক। কোনও .txtপাঠ্য ফাইলে এক্সটেনশন যুক্ত করার কোনও কারণ নেই । আপনি এটি করতে নির্দ্বিধায় রয়েছেন তবে এটি কোনওরকম কোনও পার্থক্য করে না। সুতরাং, আপনি যদি যাইহোক এক্সটেনশন চান, এর মধ্যে একটি ব্যবহার করুন:

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

7

এডাব্লু কে এই কাজের জন্যও উপযুক্ত:

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
@ কোস যদি ফাইলের প্রতিটি লাইনে প্রতি লাইন প্রতি ঠিক একটি স্ট্রিং থাকে তবে তা প্রতি লাইনে একটি ফাইল তৈরি করে। এটি কার্যকরভাবে হিসাবে একই echo "" | tee file1 file2 file2। যদি ফাইলনামে ফাঁকা জায়গা থাকে তবে তা ভাঙ্গবে।
সের্গেই কলডিয়াজনি

7

ধরা যাক আমার কাছে একটি পাঠ্য ফাইল আছে ...

ধরা যাক, আমার একটি উত্তর আছে ;)

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

স্পেস সহ এবং প্রত্যয় সহ জলরোধী =)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.