একটি সাধারণ কলাম ব্যবহার করে ফাইলগুলি মার্জ করুন


8

আমার দুটি ফাইল রয়েছে যার মধ্যে আমি একটি তৃতীয় তৈরি করতে চাই যাতে সমস্ত তথ্য থাকে।

ফাইল 1:

a 111 
b 222 
c 333 
d 666 
e 777 

ফাইল 2:

111 x1  
222 x2
333 x3
444 x4 
555 x5 
666 x6 
777 x7 
888 x8

আমি নিম্নলিখিত হিসাবে তাদের একত্রিত করতে চাই:

111  x1  a
222  x2  b
333  x3  c
444  x4  0
555  x5  0
666  x6  d
777  x7  e
888  x8  0

বিঃদ্রঃ:

ফাইল 1 এর দ্বিতীয় কলামটি ফাইল 2 এর প্রথম কলামের একটি উপসেট

উত্তর:


7

joinকমান্ড প্রায় নেই আপনার যা প্রয়োজন, যদি ফাইলগুলি আপনার নমুনার হিসেবে সাজানো হয়:

join -12 -a2 file1 file2 -o2.1,2.2,1.1

আপনার কেবল কোনও মিল নেই লাইনগুলিতে শূন্যগুলি যুক্ত করতে হবে। আপনি তার জন্য -eস্যুইচটি ব্যবহার করতে পারেন :

join -12 -a2 file1 file2  -o2.1,2.2,1.1 -e0

যদি আপনি যুক্ত করেন তবে -e0
— পার্লের

@ লিলোক্স: সত্য, ধন্যবাদ আমি চেষ্টা করেছি কিন্তু ব্যর্থ (টাইপো)।
— চোরোবা

13

যোগদান ব্যবহার:

join -1 1 -2 2 -a1 -e0 -o'0,1.2,2.1' file2 file1

Join কমান্ড দুটি ফাইলের লাইনে যোগ দেয় যা একটি সাধারণ ক্ষেত্রের ডেটা ভাগ করে। এই ক্ষেত্রে: ফাইল -1 12 -2 2এবং ফাইল 1 এর সাথে ফাইল 2 এর ক্ষেত্র 1 ( ) এবং ফাইল 1 এর ক্ষেত্র 2 ( ) ব্যবহার করুন।

আউটপুটটি হবে: "যোগদান ক্ষেত্র, ফাইল 2 এর ক্ষেত্র 2, ফাইল 1 এর ক্ষেত্র 1" ( -o'0,1.2,2.1'), যদি কোনও অনুপস্থিত ক্ষেত্র থাকে তবে 0 ( -e0)

দুটি ফাইলের একটির যদি আরও রেকর্ড থাকে তবে সেগুলি যুক্ত করুন (এই ক্ষেত্রে ফাইল 2) ( -a1)

যোগদানের কমান্ডের ম্যানপেজটি উল্লেখ করুন


ভাল. আপনি কিছুটা ব্যাখ্যা যোগ করতে পারেন?
— লেটি

অবশ্যই, আপডেট হয়েছে :)
— লিলোক্স

5

একটু awkজাদু:

awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0}; \
    printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}' \
    file1 file2

অথবা

awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0};
    print $1,$2,a[$1]}' file1 file2

আউটপুট

111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

ব্যাখ্যা

  • FNR==NR{a[$2]=$1;next}

    file1( FNR==NR) চালিয়ে যায় এবং একটি মূল-মান কাঠামো তৈরি করে। কীটি হ'ল দ্বিতীয় কলাম ( $2) file1, মানটির প্রথম কলাম ( $1)file1

  • {if(a[$1]==""){a[$1]=0};print $1,$2,a[$1]}

    শেষ পর্যন্ত file2এবং

    • if(a[$1]==""){a[$1]=0}

      প্রথম কলামে ( $1) এর কীটি file2উপস্থিত না থাকলে file1আমাদের একটি দরকার0

    • print $1,$2,a[$1]

      printপ্রথম এবং দ্বিতীয় কলামটি মুদ্রণ (ব্যবহার করে ) এবং প্রথম file2-কলামের ( $1) এর কী সহ মূল-মান কাঠামোর মানfile2

      অথবা

    • printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}'

      printfএর প্রথম এবং দ্বিতীয় কলামটি মুদ্রণ (ব্যবহার করে ) file2এর প্রথম কলামের ( $1) এর কী সহ মূল-মান কাঠামোর মান file2।

      • FS ইনপুট ফাইল থেকে নেওয়া কলামগুলির মধ্যে বিভাজক

      • "%s%s%s%s%s\n"

        আউটপুট জন্য বিন্যাস হয়

        • %s - স্ট্রিং

        • \n - নতুন লাইন


আপনি কোড ব্যাখ্যা করতে পারেন?
— gfor89

অবশ্যই, উত্তর আপডেট হয়েছে।
— এবি

1

ব্যবহার কুই :

$ q "select f2.c1, f2.c2, ifnull(f1.c1,0) from file_2.txt f2 LEFT JOIN file_1.txt f1 on f1.c2 = f2.c1 "
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

এটি কখনও কখনও এইভাবে আরও পঠনযোগ্য হতে পারে।


1
যে কারও জন্যই ভাবছেন, qপ্যাকেজটিতে রয়েছে python3-q-text-as-data(পাইথন 3) এবং প্যাকেজে python-q-text-as-data(পাইথন 2)।
— কোস

ধন্যবাদ, তবে আমি এই qপ্যাকেজটি কোথায় পাব ? আমি ইনস্টল করতে সক্ষম হবে বলে মনে হয় না python-q-text-as-dataবা python3-q-text-as-data। "ই: প্যাকেজ পাইথন 3-কিউ-টেক্সট-হিসাবে ডেটা সনাক্ত করতে অক্ষম"। আমার সিস্টেম ইতিমধ্যে ইনস্টল করেছেন python, python2.7, python3, এবং python3.4।
— ধানের ল্যান্ডাউ

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