ফাইলগুলি কনটেনেট করা এবং ফাইলগুলির মধ্যে নতুন লাইন .োকান


127

আমার একাধিক ফাইল রয়েছে যা দিয়ে আমি কনটাক্ট করতে চাই cat। চল বলি

File1.txt 
foo

File2.txt
bar

File3.txt
qux

আমি কনট্যাক্ট করতে চাই যাতে চূড়ান্ত ফাইলটি দেখতে লাগে:

foo

bar

qux

এর পরিবর্তে যথারীতি cat File*.txt > finalfile.txt

foo
bar 
qux

এটি করার সঠিক উপায় কী?


উত্তর:


121

আপনি করতে পারেন:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done

আপনি finalfile.txtউপরের কমান্ডটি চালানোর আগে ফাইলটি বিদ্যমান নেই তা নিশ্চিত করুন ।

আপনি যদি ব্যবহারের অনুমতি পান তবে awkআপনি এটি করতে পারেন:

awk 'FNR==1{print ""}1' *.txt > finalfile.txt

10
AWK '{print $0}' *.txt
টাইগার

7
এর স্বতন্ত্র ত্রুটি রয়েছে যে খালি লাইনগুলি হয় শেষে (প্রথম বিকল্প থেকে) বা শুরুতে (দ্বিতীয় বিকল্প) থাকবে। পরিবর্তে আপনি সহজেই এর থেকে রক্ষা করতে পারেন awk 'FNR==1 && NR > 1 ...', যদিও।
ট্রিপলি

5
আপনি যদি অ্যাপ্লিকেশনটির পরিবর্তে ওভাররাইট করতে পারেন >finalfile.txtতার পরে রাখেন doneযা লুপের আগে ফাইলটি অনুপস্থিত বা খালি রয়েছে তা নিশ্চিত করার জন্য প্রয়োজনীয়তা সরিয়ে ফেলবে।
ট্রিপলি

53

যদি আপনার কাছে পর্যাপ্ত পরিমাণ ফাইল থাকে যা আপনি প্রতিটিকে তালিকাভুক্ত করতে পারেন তবে আপনি প্রতিটি জোড়া ফাইলের মধ্যে একটি নতুন লাইন সন্নিবেশ করিয়ে বাশের প্রক্রিয়া বিকল্প ব্যবহার করতে পারেন :

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt

1
সুন্দর! ধন্যবাদ।
বব কোসিস্কো

এটি আমার লেটসনক্রিপটি .pem ফাইলগুলি তৈরি করার জন্য ভালভাবে কাজ করেছে।
leeman24

35

এটি যদি আমি করতাম তবে আমি সেড ব্যবহার করতাম:

sed -e '$s/$/\n/' -s *.txt > finalfile.txt

এই ছদ্মরূপে প্যাটার্নটির দুটি অর্থ রয়েছে, প্রথমত এটি কেবল শেষ লাইন সংখ্যার সাথে মেলে (কোনও প্যাটার্ন প্রয়োগ করার জন্য রেখার সীমা হিসাবে) এবং দ্বিতীয়ত এটি প্রতিস্থাপনের প্যাটার্নে রেখার শেষের সাথে মেলে।

যদি আপনার সেডের সংস্করণটিতে না থাকে -s(পৃথকভাবে ইনপুট ফাইলগুলি প্রসেস করা হয়) তবে আপনি লুপ হিসাবে এটি সব করতে পারেন:

for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt

3
বা জিএনইউ সেডে:sed -s '$G' *.txt > finalfile.txt
রুড হেল্ডারম্যান

একটাই ধারা! এটি গ্রহণযোগ্য উত্তর হওয়া উচিত!
ইয়াসাইন এলবাডাউই

সাবধান লোকেরা, আমি কেবলমাত্র আমার পিসি ক্র্যাশ করেছি কারণ আমি findএর জায়গায় ব্যবহার করেছি *.txt, যার অর্থ ফাইলটি নিজেই সংযোজন করা হয়েছিল!
জেরুস

11

আপনি xargsযদি এটি চান তবে এটি ব্যবহার করতে পারেন তবে মূল ধারণাটি এখনও একই same

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt

1
ধন্যবাদ। xargsব্যাশে লুপের চেয়ে আমি ব্যবহার করা অনেক সহজ মনে করি।
RawwrBag

9

এটি ব্যাশে কাজ করে:

for f in *.txt; do cat $f; echo; done

>>(অ্যাপেন্ড) সহ উত্তরগুলির বিপরীতে , এই কমান্ডের আউটপুটটি অন্যান্য প্রোগ্রামগুলিতে পাইপ করা যায়।

উদাহরণ:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt (প্যারেনগুলি alচ্ছিক)
  • for ... done | less (কম মধ্যে পাইপিং)
  • for ... done | head -n -1 (এটি ফাঁকা ফাঁকা রেখা ছাড়িয়ে)

7

এইভাবে আমি ওএসএক্স 10.10.3 এ এটি করেছি

for f in *.txt; do (cat $f; echo '') >> fullData.txt; done

যেহেতু সাধারণ 'ইকো' কমান্ডটি কোনও প্যারাম ছাড়াই শেষ হয়নি কোনও নতুন লাইন .োকানো হয়নি।


এটি ফাইলের শেষে স্ট্রিং রাখে; আমি কীভাবে এটি প্রতিটি ফাইলের মধ্যে সন্নিবেশ করব ?
onassar

3

পাইথনে, এটি ফাইলগুলির মধ্যে ফাঁকা রেখার সাথে সম্মতি দেয় ( ,দমনগুলি অতিরিক্ত ট্রেলিং ফাঁকা রেখা যুক্ত করে):

print '\n'.join(open(f).read() for f in filenames),

এখানে কুরুচিপূর্ণ পাইথন ওয়ান-লাইনার যা শেল থেকে ডেকে আউটপুট একটি ফাইলে প্রিন্ট করতে পারে:

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.