ডিরেক্টরিতে সমস্ত (পাঠ্য) ফাইলকে কীভাবে একত্রী করবেন?


89

আমি 14 টি ফাইল পেয়েছি যা সবগুলিই একটি পাঠ্যের অংশ। আমি এগুলিকে একটিতে মিশতে চাই। কিভাবে যে কি?

উত্তর:


168

এটি প্রযুক্তিগতভাবে যা করা হয় cat("কনটেনেটেট") যা করার কথা, যদিও বেশিরভাগ লোকেরা এটিকে স্টডআউটে ফাইল আউটপুট দেওয়ার জন্য ব্যবহার করে। আপনি যদি এটি একাধিক ফাইলের নাম দেন তবে এটি সমস্তগুলি ক্রমানুসারে আউটপুট করবে এবং তারপরে আপনি এটিকে একটি নতুন ফাইলে পুনর্নির্দেশ করতে পারেন; সমস্ত ফাইলের ক্ষেত্রে কেবল ব্যবহার করুন *(বা /path/to/directory/*আপনি যদি ইতিমধ্যে ডিরেক্টরিতে না থেকে থাকেন) এবং আপনার শেল এটি সমস্ত ফাইলের নামের সাথে প্রসারিত করবে

$ cat * > merged-file

15
সাবধান হোন যে আপনার উদ্ধৃত কমান্ড সম্ভবত পোস্টার যা চাইবে কেবল সেটাই করবে যদি শেলটি *"প্রাকৃতিক" ক্রমে প্রসারিত হয় এমনভাবে এমন হয় যাতে তারা শনাক্ত করা হয়। আপনার যদি "file1.txt ... file9.txt ... file14.txt" থাকে তবে এটি কাজ করবে না কারণ file1? .Txt ফাইল1.txt এবং file2.txt এর মধ্যে বাছাই করবে। আপনি তাদের নাম "ফাইল01.txt ... file09.txt ... file14.txt" রাখতে হবে। echo *আপনি নিশ্চিত না হলে বলুন ।
ওয়ারেন ইয়ং

2
@ ওয়ারেন: ভাল পয়েন্ট (বা আপনি zsh ব্যবহার করতে পারেন এবং এর numeric_glob_sortবিকল্পটি সেট করতে পারেন )।
গিলস

2
@ ওয়ারেন-ইয়ং একটি সঠিক, দরকারী সতর্কতা মন্তব্য। তবে আমার আসল ক্ষেত্রে অর্ডারটি কোনও পার্থক্য করে না (কারণ ফাইলগুলিতে কেবলমাত্র সাধারণ এসকিউএল স্টেটমেন্ট রয়েছে যা ডেটা রেকর্ড সন্নিবেশ করে যার কোনও নির্ভরতা নেই)।
ইভান

2
সাবধান, ফাইলগুলির গণনা যদি একটি নির্দিষ্ট সীমা অতিক্রম করে, আপনি - / বিন / বিড়ালের মতো ত্রুটিগুলিতে দৌড়াতে পারেন: আর্গুমেন্ট তালিকাটি দীর্ঘ দীর্ঘ
নূপুর

1
@ ARA1307 কেবলমাত্র যদি ফাইলটি ইতিমধ্যে বিদ্যমান থাকে; অন্যথায় শেলটি এতে লেখার জন্য ফাইলটি খোলার আগে গ্লোবটি প্রসারিত হবে। যদিও সেই পরিস্থিতিতে ভাল পয়েন্ট
মাইকেল মরোজেক

25

যদি আপনার ফাইলগুলি একই ডিরেক্টরিতে না থাকে তবে আপনি কনকেন্টেশনের আগে ফাইন্ড কমান্ডটি ব্যবহার করতে পারেন:

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

এটি ফাইল অর্ডার সংরক্ষণ করতে পারে বা নাও করতে পারে।


1
আপনার কাছে প্রচুর ফাইল থাকলে এই উপায় way আপনি "যুক্তি তালিকা খুব দীর্ঘ" ত্রুটি এড়ান।
17

2
আপনার -Name * .csv এর পরিবর্তে "* .csv" নাম প্রয়োজন - উদ্ধৃতি ব্যতীত এটি ব্যর্থ হয়।
পিটারিস 14

কোটগুলির প্রয়োজনীয়তা ফাইন্ড কমান্ডের সংস্করণটির উপর নির্ভর করে, বিশেষত ফাইন্ড এবং অ্যাজক এ সমস্যা যখন আপনি ম্যাকের সাথে থাকবেন তখন উভয় প্রোগ্রামের সংস্করণগুলি কিছুটা পুরানো old এখনও অবধি উবুন্টু, ফেডোরা, ডেবিয়ান এবং
সেন্টোস এ

আমি যখন নকশার সাথে মেলে এমন বর্তমান ডিরেক্টরির মধ্যে কোন ফাইল কাজ করতে unquoted সংস্করণ আশা "*.csv", যেহেতু শেল তারপর আক্ষরিক পাস হবে *থেকে find
আরজেহান্টার


9

আদেশ

$ cat * > merged-file

প্রকৃতপক্ষে একযোগে 'মার্জড-ফাইল' অন্তর্ভুক্ত করে একটি রান-অ্যাওয়ে ফাইল তৈরির অনাকাঙ্ক্ষিত পার্শ্ব-প্রতিক্রিয়া রয়েছে। এটি পেতে, হয় মার্জ করা ফাইলটি একটি ভিন্ন ডিরেক্টরিতে লিখুন;

$ cat * > ../merged-file

বা এমন একটি প্যাটার্ন ম্যাচ ব্যবহার করুন যা মার্জ হওয়া ফাইলটিকে উপেক্ষা করবে;

$ cat *.txt > merged-file

14
cat * > merged-fileঠিকভাবে কাজ করে. ফাইল তৈরির আগে গ্লোবগুলি প্রক্রিয়া করা হয়। যদি merged-fileইতিমধ্যে বিদ্যমান থাকে cat(কমপক্ষে আমার) এটি আউটপুট ফাইলটি সনাক্ত করবে এবং এটি পড়তে অস্বীকার করবে। যদি ফাইলটি ইতিমধ্যে বিদ্যমান থাকে এবং আপনি পাইপলাইনে পরে পুনঃনির্দেশিত হন, তবে এটি অবশ্যই তা করতে পারে না, তারপরে এবং কেবল তখনই আপনি পলাতক ফাইলটি পান।
কেভিন

catফাইলটি আউটপুট এক কিনা তা সনাক্ত করার কোনও উপায় নেই। পুনর্নির্দেশটি শেলের মধ্যে ঘটে; catস্টাডাউট শুধুমাত্র প্রিন্ট।
bfontaine

8

এখান থেকে অন্যদের মতো বলুন ... আপনি ব্যবহার করতে পারেন 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

1
নোট করুন যে স্ট্রিংটি [01-03]গ্লোববিং প্যাটার্ন হিসাবে কাজ করবে না।
কুসালানন্দ

0

আপনি patternকোনও ফাইলের সুনির্দিষ্ট উল্লেখ করতে পারেন তারপরে সেগুলি সমস্ত একত্রিত করুন:

cat *pattern* >> mergedfile

0

অন্য বিকল্পটি হল:

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