অন্য একটি ফাইলের মধ্যে লাইনগুলি পাওয়ার জন্য কি কোনও সরঞ্জাম আছে?


110

এমন কোনও সরঞ্জাম আছে যা লাইন পেতে পারে যা ফাইল এ থাকে তবে ফাইল বি থাকে না? আমি পার্ল দিয়ে কিছুটা সহজ স্ক্রিপ্ট তৈরি করতে পারতাম, তবে এর আগে যদি ইতিমধ্যে কিছু থাকে তবে আমি এখন থেকে আমার সময় বাঁচাব।



উত্তর:


159

হ্যাঁ. grepপাঠ্য স্ট্রিংগুলির জন্য ফাইলগুলি অনুসন্ধানের জন্য আদর্শ সরঞ্জামটি অন্য একটি ফাইলের সমস্ত লাইন বিয়োগ করতে ব্যবহার করা যেতে পারে।

grep -F -x -v -f fileB fileA

এটি ফাইলবির প্রতিটি লাইনকে নিদর্শন ( -f fileB) হিসাবে ব্যবহার করে এবং এটি ম্যাচ করার জন্য একটি সরল স্ট্রিং হিসাবে বিবেচনা করে কাজ করে (নিয়মিত রেজেক্স নয়) ( -F)। আপনি ম্যাচটি পুরো লাইনে ( -x) করতে বাধ্য করে এবং কেবল যে লাইনগুলি মেলে না তা মুদ্রণ করে ( -v)। অতএব আপনি ফাইলএলাইনগুলিতে লাইনগুলি মুদ্রণ করছেন যা ফাইলবিতে কোনও লাইনের মতো একই ডেটা ধারণ করে না।

এই সমাধানটির ক্ষতিটি হ'ল এটি লাইন ক্রমটিকে বিবেচনায় নেয় না এবং যদি আপনার ইনপুটটিতে বিভিন্ন জায়গায় সদৃশ লাইন থাকে তবে আপনি যা আশা করেন তা পেতে পারেন না। এর সমাধান হ'ল আসল তুলনার সরঞ্জাম যেমন ব্যবহার করা diff। আপনি ফাইলের 100% রেখার প্রসঙ্গের মান সহ একটি পৃথক ফাইল তৈরি করে এটি করতে পারেন, তবে এটি কেবলমাত্র রেখাগুলির জন্য পার্স করে যা ফাইল এ-তে বি রূপান্তরিত হলে মুছে ফেলা হবে (নোট এই আদেশটি পৃথককেও সরিয়ে দেয় সঠিক লাইনের পরে বিন্যাসকরণ।)

diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC

@ inderpreet99 লোয়ার কেস -uআর্গুমেন্ট আসলে কোনও সংখ্যার পরামিতি নেয় যতক্ষণ না এটি স্পেস অনুসরণ না করে। আমার আগে যেভাবে ছিল তা হ'ল সুবিধাটি হ'ল এটি কোনও মান সহ বা ছাড়াই কাজ করবে, সুতরাং আপনি সেই উপ-কমান্ডের রুটিনে এমন কিছু ব্যবহার করতে পারেন যা আউটপুট না হয়ে ফিরে আসে। অন্যদিকে উচ্চতর ক্ষেত্রে '-U' এর জন্য একটি যুক্তি প্রয়োজন।
কালেব

: সতর্কতা অবলম্বন করা আবশ্যক,, grep -f হয় O (n ^ 2) আমি বিশ্বাস করি stackoverflow.com/questions/4780203/...
rogerdpack

1
diffপাইপলাইন একটি আচরণ ধন্যবাদ কাজ করে।
ফিলিপ আলভারেজ

বাছাইয়ের সমস্যাটির জন্য অ্যাকাউন্ট করতে, প্রতিটি ফাইলটি প্রয়োজনীয়তার আগে প্রক্রিয়া করার জন্য আপনি কমান্ডের প্রক্রিয়া বিকল্প ব্যবহার করতে পারেন grep। উদাহরণ:grep -F -x -v -f <(sort fileB) <(sort fileA)
টনি সিজারো

@ টনিসেসারো এটি কাজ করবে যদি আপনার ডেটা সেটটি নির্দিষ্ট অর্ডার না করে এবং ডুপ্লিকেটগুলি অ্যাকাউন্টে নেওয়ার প্রয়োজন না হয়। ব্যবহারের সুবিধাটি diffহ'ল ফাইলের সেই অবস্থানটি অ্যাকাউন্টে নেওয়া হয়।
কালেব

57

উত্তর আপনি তুলনা করছেন ফাইলের ধরণ এবং ফর্ম্যাট উপর একটি মহান চুক্তি নির্ভর করে।

আপনি যে ফাইলগুলির সাথে তুলনা করছেন সেগুলি যদি পাঠ্য ফাইলগুলি বাছাই করা হয়, তবে রিচার্ড স্টালম্যান এবং ডেভিড ম্যাকেনজির লিখিত জিএনইউ সরঞ্জামটি commআপনার পরে থাকা ফিল্টারিং সম্পাদন করতে পারে। এটি কোর্টিলের অংশ।

উদাহরণ

বলুন যে আপনার কাছে নিম্নলিখিত 2 টি ফাইল রয়েছে:

$ cat a
1
2
3
4
5

$ cat b
1
2
3
4
5
6

ফাইলের মধ্যে লাইনস bযে ফাইল নেই a:

$ comm <(sort a) <(sort b) -3
    6

1
উল্লেখের জন্য +1 comm; দুর্ভাগ্যক্রমে, commবাছাই করা ফাইলগুলির প্রয়োজন
আর্জেজ

11
তাই তাদের বাছাই? কম <(সাজানো a) <(সাজানো বি) -1 -2
সিরেক্স

এটি কিছু অদ্ভুত বাক্য গঠন। <()? এটি কাজ করে এবং আমি এটি পেয়েছি, তবে এই অদ্ভুততার কোনও নাম আছে?
mlissner

2
@ এমসিস্নার প্রক্রিয়া বিকল্প<() হিসাবেও পরিচিত ।
মিকু

1
commআরএমএস নয়, বেল ল্যাবস-এ কেউ লিখেছেন মূলত ১৯ circ৩ এর সার্কা। আপনি GNU বাস্তবায়নের কথা উল্লেখ করছেন যা অনেক পরে এসেছিল। কয়েক বছর ধরে ইউনিক্স ইউটিলিটিগুলির বিভিন্ন বাস্তবায়ন হয়েছে।
স্টাফেন চেজেলাস

32

স্ট্যাকওভারফ্লো থেকে ...

কম -23 ফাইল 1 ফাইল 2

-23 উভয় ফাইলে বা কেবল 2 ফাইলের মধ্যে থাকা লাইনগুলি দমন করে The ফাইলগুলি বাছাই করতে হবে (তারা আপনার উদাহরণে রয়েছে) তবে তা না হলে প্রথমে বাছাইয়ের মাধ্যমে পাইপ করুন ...

ম্যান পৃষ্ঠাটি এখানে দেখুন


এটি কোনও কারণে আমার পক্ষে কাজ করে না ...
জানুয়ারী

@ জন আপনার ফাইল বাছাই করা হয়? আপনি তাদের বাছাই কিভাবে?
জেজেএস

8

গ্রেপ এবং কম (ধরণের সহ) পদ্ধতিগুলি বড় ফাইলগুলিতে দীর্ঘ সময় নেয় । সিজিএক্সএক্স এবং ঘোস্টডোগ 74 স্ট্যাক ওভারফ্লোতে দুটি ফাইলের মধ্যে একটির জন্য অনন্য লাইনগুলি আহরণের জন্য দুটি দুর্দান্ত অ্যাডক পদ্ধতি শেয়ার করেছে :

$ awk 'FNR==NR{a[$0]++}FNR!=NR && !a[$0]{print}' file1 file2

$ awk 'FNR==NR{a[$0]++;next}(!($0 in a))' file1 file2

2
আপনি যদি বিশাল ফাইল দিয়ে এটি করছেন, তবে একটি বড় ফাইলকে একটি এসোসিয়েটিভ অ্যারেতে লোড করার মেমরির সীমাবদ্ধতাগুলি প্রতিরোধমূলক হতে চলেছে।
চার্লস ডাফি

4

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

sort file1 > 1 
sort file2 > 2 
diff 1 2 | grep "\>" | sed -e 's/> //'

[ফাইল 2-ফাইল 1 ফলাফল স্ক্রিনে, পাইপ থেকে ফাইল ইত্যাদি]]

পরিবর্তন >করা <বিপরীত বিয়োগফল পাবেন।rm 1 2


2

আপনি ভিমডিফও বিবেচনা করতে পারেন, এটি কোনও ভিএম সম্পাদকের ফাইলগুলির মধ্যে পার্থক্য তুলে ধরে


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