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


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.