উত্তর:
এটি প্রযুক্তিগতভাবে যা করা হয় cat
("কনটেনেটেট") যা করার কথা, যদিও বেশিরভাগ লোকেরা এটিকে স্টডআউটে ফাইল আউটপুট দেওয়ার জন্য ব্যবহার করে। আপনি যদি এটি একাধিক ফাইলের নাম দেন তবে এটি সমস্তগুলি ক্রমানুসারে আউটপুট করবে এবং তারপরে আপনি এটিকে একটি নতুন ফাইলে পুনর্নির্দেশ করতে পারেন; সমস্ত ফাইলের ক্ষেত্রে কেবল ব্যবহার করুন *
(বা /path/to/directory/*
আপনি যদি ইতিমধ্যে ডিরেক্টরিতে না থেকে থাকেন) এবং আপনার শেল এটি সমস্ত ফাইলের নামের সাথে প্রসারিত করবে
$ cat * > merged-file
numeric_glob_sort
বিকল্পটি সেট করতে পারেন )।
যদি আপনার ফাইলগুলি একই ডিরেক্টরিতে না থাকে তবে আপনি কনকেন্টেশনের আগে ফাইন্ড কমান্ডটি ব্যবহার করতে পারেন:
find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
যখন আপনার ফাইলগুলি ইতিমধ্যে অর্ডার হয়ে থাকে এবং আপনি সেগুলি বিশ্লেষণ করতে তাদের মার্জ করতে চান তখন খুব দরকারী।
আরও বহনযোগ্য:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
এটি ফাইল অর্ডার সংরক্ষণ করতে পারে বা নাও করতে পারে।
"*.csv"
, যেহেতু শেল তারপর আক্ষরিক পাস হবে *
থেকে find
।
আদেশ
$ cat * > merged-file
প্রকৃতপক্ষে একযোগে 'মার্জড-ফাইল' অন্তর্ভুক্ত করে একটি রান-অ্যাওয়ে ফাইল তৈরির অনাকাঙ্ক্ষিত পার্শ্ব-প্রতিক্রিয়া রয়েছে। এটি পেতে, হয় মার্জ করা ফাইলটি একটি ভিন্ন ডিরেক্টরিতে লিখুন;
$ cat * > ../merged-file
বা এমন একটি প্যাটার্ন ম্যাচ ব্যবহার করুন যা মার্জ হওয়া ফাইলটিকে উপেক্ষা করবে;
$ cat *.txt > merged-file
cat * > merged-file
ঠিকভাবে কাজ করে. ফাইল তৈরির আগে গ্লোবগুলি প্রক্রিয়া করা হয়। যদি merged-file
ইতিমধ্যে বিদ্যমান থাকে cat
(কমপক্ষে আমার) এটি আউটপুট ফাইলটি সনাক্ত করবে এবং এটি পড়তে অস্বীকার করবে। যদি ফাইলটি ইতিমধ্যে বিদ্যমান থাকে এবং আপনি পাইপলাইনে পরে পুনঃনির্দেশিত হন, তবে এটি অবশ্যই তা করতে পারে না, তারপরে এবং কেবল তখনই আপনি পলাতক ফাইলটি পান।
cat
ফাইলটি আউটপুট এক কিনা তা সনাক্ত করার কোনও উপায় নেই। পুনর্নির্দেশটি শেলের মধ্যে ঘটে; cat
স্টাডাউট শুধুমাত্র প্রিন্ট।
এখান থেকে অন্যদের মতো বলুন ... আপনি ব্যবহার করতে পারেন cat
বলুন আপনার কাছে রয়েছে:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
এবং আপনি শুধুমাত্র চান file01
করতে file03
এবং fileA
করতে fileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
বা, ব্রেস সম্প্রসারণ ব্যবহার করে:
cat ~/file0{1..3} ~/file{A..C} > merged-file
বা, ফ্যানসিয়ার ব্রেস সম্প্রসারণ ব্যবহার করে:
cat ~/file{0{1..3},{A..C}} > merged-file
অথবা আপনি for
লুপ ব্যবহার করতে পারেন :
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
[01-03]
গ্লোববিং প্যাটার্ন হিসাবে কাজ করবে না।
আপনি pattern
কোনও ফাইলের সুনির্দিষ্ট উল্লেখ করতে পারেন তারপরে সেগুলি সমস্ত একত্রিত করুন:
cat *pattern* >> mergedfile
অন্য বিকল্পটি হল:
sed r 1.txt 2.txt 3.txt > merge.txt
অথবা ...
sed h 1.txt 2.txt 3.txt > merge.txt
অথবা ...
sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
বা পুনঃনির্দেশ ছাড়াই ...
sed wmerge.txt 1.txt 2.txt 3.txt
নোট করুন যে শেষ লাইনের লিখনটিও মার্জ.টেক্সট (ডুবে যাওয়া নয়। টেক্সট!)। ফাইল নামের সাথে বিভ্রান্তি এড়ানোর জন্য আপনি w "मर्জ.টেক্সট" ব্যবহার করতে পারেন, এবং নীরব আউটপুট ব্যবহার করতে পারেন।
অবশ্যই, আপনি ওয়াইল্ড কার্ডের সাহায্যে ফাইল তালিকাও ছোট করতে পারেন। উদাহরণস্বরূপ, উপরের উদাহরণগুলির মতো সংখ্যাযুক্ত ফাইলগুলির ক্ষেত্রে আপনি এই ধরণের ধনুর্বন্ধনী সহ সীমাটি নির্দিষ্ট করতে পারেন:
sed -n w"merge.txt" {1..3}.txt
*
"প্রাকৃতিক" ক্রমে প্রসারিত হয় এমনভাবে এমন হয় যাতে তারা শনাক্ত করা হয়। আপনার যদি "file1.txt ... file9.txt ... file14.txt" থাকে তবে এটি কাজ করবে না কারণ file1? .Txt ফাইল1.txt এবং file2.txt এর মধ্যে বাছাই করবে। আপনি তাদের নাম "ফাইল01.txt ... file09.txt ... file14.txt" রাখতে হবে।echo *
আপনি নিশ্চিত না হলে বলুন ।