দুটি ফাইল থেকে বিকল্প লাইনগুলি মার্জ করুন


9

file1:

.tid.setnr := 1123 
.tid.setnr := 3345 
.tid.setnr := 5431
.tid.setnr := 89323

File2:

.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60

আউটপুট ফাইল:

.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

2
দয়া করে সবসময় আপনার অপারেটিং সিস্টেম উল্লেখ। স্ট্যান্ডার্ড সরঞ্জামগুলির অনেকগুলি বিভিন্ন ওএসে আলাদাভাবে আচরণ করে যাতে আপনি কী ব্যবহার করছেন তা আমাদের জানতে হবে।
টেরডন

উত্তর:




5

pasteসমাধান সবচেয়ে পোর্টেবল এবং সবচেয়ে কার্যকরী। আমি কেবলমাত্র এই বিকল্পটির উল্লেখ করছি যদি আপনি দুটি ক্ষেত্রে একই সংখ্যায় লাইন না থাকে এমন ক্ষেত্রে আপনি তার আচরণটিকে পছন্দ করেন:

জিএনইউ সহ sed:

sed Rfile1 file2

যদি file1এর চেয়ে কম লাইন থাকে file2তবে file1ক্লান্ত হয়ে গেলে এর জন্য sedকিছু আউটপুট দেয় না (খালি লাইনের বিপরীতে paste)।

যদি file1এর চেয়ে বেশি লাইন থাকে file2তবে সেই অতিরিক্ত লাইনগুলি ফেলে দেওয়া হবে ( file2সাথে খালি লাইনগুলি মুদ্রণের বিপরীতে paste)।

$ paste a b
1       a
2       b
3
4
$ paste -d \\n a b
1
a
2
b
3

4

$ sed Rb a
1
a
2
b
3
4
$ sed Ra b
a
1
b
2

4

ব্যবহার awk( gawk, nawk, mawk):

awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1 > outputfile
  • NR==FNR {x[FNR]=$0;next}: NR==FNRকেবলমাত্র বর্তমান রেকর্ড নম্বরটি বর্তমান ফাইল রেকর্ড সংখ্যার সমান (তবে এটি কেবল প্রথম ফাইলটি প্রক্রিয়াকরণের সময় মিলেছে): বর্তমানে প্রক্রিয়াকৃত রেকর্ডটিকে xবর্তমান ফাইল রেকর্ড সংখ্যার সমান একটি সূচীতে অ্যারেতে সংরক্ষণ করে এবং এড়িয়ে যায় বর্তমান রেকর্ড
  • {print x[FNR]"\n"$0}: xবর্তমান ফাইল রেকর্ড সংখ্যার সমান সূচীতে অ্যারের সামগ্রীটি একটি নতুন লাইন এবং বর্তমান রেকর্ডের সামগ্রী দ্বারা মুদ্রণ করে
~/tmp$ cat file1
.tid.setnr := 1123
.tid.setnr := 3345
.tid.setnr := 5431
.tid.setnr := 89323
~/tmp$ cat file2
.tid.info := 12
.tid.info := 3
.tid.info := 44
.tid.info := 60
~/tmp$ awk 'NR==FNR {x[FNR]=$0;next} {print x[FNR]"\n"$0}' file2 file1
.tid.info := 12
.tid.setnr := 1123
.tid.info := 3
.tid.setnr := 3345
.tid.info := 44
.tid.setnr := 5431
.tid.info := 60
.tid.setnr := 89323

এটি আউটপুট দিচ্ছে তবে আমি যা চাইছিলাম ঠিক তেমন নয়। tid.info লাইনগুলি আমার আউটপুট ফাইলে tid.setnr লাইনের পরে আসবে।
pmaipmui

@ ন্যানিতা আপনি আপনার উদাহরণ আউটপুটে এটি প্রদর্শন করছেন।
কোস

@ নেনিটা যেভাবেই আউটপুট ক্রম পরিবর্তন করতে আপনি কেবল স্যুইচ করতে পারেন file1এবং file2কমান্ডে।
কোস

হ্যাঁ ... আমিও একই কাজ করেছি তবে এটি আগের মতোই মুদ্রণ করছিল। tid.setnr মুদ্রণের পরে এটি tid.info মূল্য ছিল।
pmaipmui

1
@ মিমকিজার তবে যেহেতু আমি এতে ছিলাম আমি চেষ্টাও করেছি mawk, এবং এটি এর উপরও চলে runs যাই হোক যুক্তিযুক্ত হচ্ছে আমি কেন এটা কাজ করা উচিত নয় দেখতে পাচ্ছি না শুধু অন্য উপায় কাছাকাছি (অর্থাত শুধু ফাইল সুইচিং দ্বারা)। এটি যে awkইনপুট সম্পর্কে চিন্তা করে না, লাইনগুলি লাইন। যদি কোনও কিছু তার সংস্করণ দ্বারা সমর্থিত না হয় তবে এটি কেবল প্রথমবারই ভেঙে যায়। আরও সহজ উপায়, কেবল ওপি আর্গুমেন্টগুলিতে ইনপুট ফাইলগুলি স্যুইচ করতে একটি ভুল করেছিল।
কোস

-1

সবচেয়ে সহজ সমাধান নীচে দেওয়া হল।

cat file1 >> file2

অথবা

cat file2 >> file1

1
সত্য, আবার প্রশ্ন পড়ুন; এটি অন্য ফাইলের সামগ্রীতে একটি ফাইলের বিষয়বস্তু সংযোজন করে। এটি লাইনগুলি পর্যায়ক্রমে ফাইলগুলিকে একীভূত করে না (সুতরাং একটি লাইন file1তখন এক লাইন থেকে আরও এক লাইনে file2...)
ডোন_ক্রিসটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.