ফাইলের সমস্ত লাইন বিভিন্ন ফাইলে ঘটে কিনা তা পরীক্ষা করে দেখুন


14

আমি দুটি ফাইল পেয়েছি: প্রায় 10,000 লাইনের সাথে ফাইল 1 এবং কয়েকশ লাইনের সাথে ফাইল 2। আমি ফাইলের সমস্ত লাইন ফাইল 1-এ ঘটে কিনা তা পরীক্ষা করে দেখতে চাই। এটি: ∀ লাইন ℓ ∈ ফাইল 2: ℓ ∈ ফাইল 1

এই চিহ্নগুলির অর্থ কী বা "ফাইল 1-র সমস্ত লাইন ফাইল 1-এ আসে কিনা তা যাচাই করে" এর অর্থ কি কেউ জানতে না পারে: ফাইলগুলিতে বেশ কয়েকটি সমতুল্য রেখাগুলি ফাইলগুলি প্রয়োজনীয়তা পূরণ করে কিনা তা চেকটি প্রদান করে কিনা তা প্রভাবিত করে না।

আমি এটা কিভাবে করবো?


2
এই ফাইলগুলি নকল লাইন থাকতে পারে? যদি file22 টি লাইন থাকে তবে আপনার কমপক্ষে 2 টি লাইন থাকা Aদরকার ? file1A
স্টাফেন চেজেলাস

2
@ স্টাফেনচেজেলাস সমস্ত লাইন (উভয় ফাইলে) অনন্য হওয়ার গ্যারান্টিযুক্ত।
ইউটিএফ -8

1
@ ইউটিএফ -8 এটি আপনার প্রশ্নের মধ্যে সম্পাদনা করার জন্য একটি গুরুত্বপূর্ণ বিশদ হবে।
ডেভিড জেড

2
@ ডেভিডজেড আর নেই কারণ বিদ্যমান উত্তরগুলি সেই গ্যারান্টির উপর নির্ভর করে না। সুতরাং এখনই প্রশ্নটি সম্পাদনা করে, আমি উত্তরের আপাত স্কোপ হ্রাস করব।
ইউটিএফ-8

@ ইউটিএফ -8 আমি মনে করি, যদিও এটি ব্যতীত প্রশ্নটি কিছুটা অস্পষ্ট, উদাহরণস্বরূপ যদি কোনও প্রদত্ত লাইনটি ফাইল 2 এ 5 বার ঘটে, তখন কি এই লাইনটি ফাইল 1-তে 5 বার ঘটতে হবে (কেবল একবারের বিপরীতে)? আপনার যদি সেই চাহিদা থাকে তবে এটি বিদ্যমান উত্তরগুলির কোনওরূপে কাজ করবে না বলে মনে হয় না, তাই আমি কমপক্ষে এমন কিছু সম্পাদনা করার পরামর্শ দেব যা এটি পরিষ্কার করে দেয় যে এটি আপনি বোঝাতে চাইছেন না।
ডেভিড জেড

উত্তর:


18
comm -13 <(sort -u file_1) <(sort -u file_2)

এই কমান্ডটি আউটপুট লাইনগুলিতে স্বতন্ত্র হবে file_2। সুতরাং, যদি আউটপুট খালি থাকে, তবে সমস্ত file_2লাইনটি এতে অন্তর্ভুক্ত থাকে file_1

কম্মের লোক থেকে:

   With  no  options,  produce  three-column  output.  Column one contains
   lines unique to FILE1, column two contains lines unique to  FILE2,  and
   column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)

পুনঃটুইট স্থির: -uবিকল্পটি sortকমান্ডটিতে যুক্ত হয়েছে । উভয় বাছাই করা ফাইলগুলিতে এখন কেবল অনন্য লাইনই বাকী রয়েছে।
মিনিম্যাক্স

আশ্চর্যজনকভাবে সহজ সমাধান! এই সিনট্যাক্সটি এমন কোনও প্রোগ্রামের জন্য প্রযোজ্য যা ফাইলগুলি প্রত্যাশা করে? আমি সবসময় <স্টিডিন মধ্যে পাইপ ভাবেন । বন্ধনী শব্দটি এটি পরিবর্তন করে?
ইউটিএফ -8

2
@ ইউটিএফ -8 এটিকে প্রক্রিয়া প্রতিস্থাপন বলা হয় । আপনি এটি সম্পর্কে এখানে পড়তে পারেন । এবং হ্যাঁ, এটি একটি অস্থায়ী ফাইলের মতো আচরণ করে, তাই এটি কোনও প্রোগ্রামে আসল ফাইলগুলির পরিবর্তে ব্যবহার করা যেতে পারে, যা ফাইল প্রত্যাশা করে।
মিনিম্যাক্স

আপনি যদি প্রায়শই এটি করেন তবে আপনি হয়ত file_1পূর্বনির্ধারিত আকারে সঞ্চয় করতে পারেন । টাইপিং এবং সময় উভয়ই সাশ্রয় করে।
স্টিগ হেমার

7
@ এমনিম্যাক্স "কোনও" বাদে ভাল মন্তব্য করুন। প্রক্রিয়া প্রতিস্থাপন, বিস্ময়কর হলেও, সব ক্ষেত্রেই ব্যবহার করা যায় না কারণ ফলাফল প্রাপ্ত "ফাইলগুলি" স্ট্রিম এবং বাস্তব ফাইল নয়। এর অর্থ হল যে তারা কোনও সাধারণ ফাইলের মতো "সন্ধানযোগ্য" নয় এবং কেবল তখনই ব্যবহার করা যেতে পারে যখন প্রোগ্রামটি প্রথম থেকেই ফাইলটি সাধারণভাবে পড়বে, এবং যখন প্রোগ্রামটি কিছু ফাইল-কেবল কার্যকারিতা যেমন কোনও নির্দিষ্ট বিন্দু সন্ধান করতে বা ব্যবহার করে না তখন রিওয়ন্ডিং শুরু থেকে শুরু করতে। সুখের বিষয়, বেশিরভাগ প্রোগ্রামগুলি কেবল তাদের ফাইলগুলি () পড়ে এবং তাই প্রক্রিয়া প্রতিস্থাপন বেশিরভাগ প্রোগ্রামের সাথে কাজ করে তবে "কোনও" প্রোগ্রাম নয়।
Law29

7
[ $(grep -cxFf file2 <(sort -u file1)) = $(sort -u file2 | wc -l) ] && 
  echo all there || 
  echo some missing

যদি ফাইল 1-তে (অনন্য লাইনগুলির) ফাইল 2 থেকে মিলের সংখ্যা ফাইল 2-তে অনন্য লাইনের সংখ্যার সমান হয়, তবে সেগুলি সেখানে রয়েছে; অন্যথায়, তারা না।


5

জিএনইউ ব্যবহার করে awkযেখানে এটি নির্দিষ্ট length(array)বৈশিষ্ট্যটিকে সমর্থন করে (এবং কিছু অন্যান্য awkবাস্তবায়ন যা সমর্থন করতে পারে) এবং ফাইলগুলি বাছাই করা থাকলে প্রয়োজন হয় না।

gawk 'FNR==NR{seen[$0];next} ($0 in seen){delete seen[$0]};
    END{print (!length(seen))?"Matched":"Not Matched"}' file2 file1

এটি ফাইলseen 2 কে ফাইলের সম্পূর্ণ লাইন হিসাবে কী হিসাবে ডাকা একটি অ্যারেতে পড়ছে ।

তারপরে ফাইল 1 পড়ুন এবং প্রতিটি লাইনের জন্য যদি অ্যারেতে দেখা লাইনগুলির সাথে মিলে যায় তবে সেই কীটি মুছুন।

শেষে যদি অ্যারের খালি মানে সমস্ত লাইন ছিল file2 মধ্যে Exist file1 এবং প্রিন্ট হবে Matched, অন্যথায় প্রদর্শন করা হবে Not Matched


সমস্ত awkবাস্তবায়নে সামঞ্জস্যের জন্য ।

awk 'FNR==NR{seen[$0];next} ($0 in seen){delete seen[$0]};
    END{for(x in seen);print (!x)?"Matched":"Not Matched"}' file2 file1

কেবল ফাইল 2 এ খালি রেখা / বা শ্বেতস্পেসের সাথে রেখাগুলি উপেক্ষা করার জন্য , আপনাকে অ্যারেতে পড়া বাদ দিতে NFশর্তটি যুক্ত করতে হবে NR==FNR && NF {...


length(array)গোক-কেবল এএফাইক; এটি অবশ্যই পসিক্স নয়।
dave_thompson_085

@ dave_thompson_085 সঠিক, আমি আমার উত্তর আপডেট করেছি। ধন্যবাদ
нιηসнιη

3

ব্যবহার করে commআপনি উভয় ফাইলে সাধারণ লাইনগুলি খুঁজে পেতে পারেন।

comm -12 file1 file2

কটাক্ষপাত আছে man commআরো বিস্তারিত জানার জন্য


এটি উভয় ফাইলে সাধারণ লাইনগুলি ফিরিয়ে দিচ্ছে, তবে এটি ওপি'র কিউর কোনও উত্তর দেয় না যেখানে আপনার যদি ফাইললাইনে একটি লাইন থাকে যা ফাইল 1 এ প্রস্থান করে না, সুতরাং ফাইল 2 এর সমস্ত লাইন ফাইল 1 তে বিদ্যমান নেই।
нιηসнιη

1
ফাইল বাছাই করা উচিত। মানুষ থেকে " comm- দুটি বাছাই করা ফাইল লাইন লাইনে তুলনা করুন"।
মিনিম্যাক্স

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

3
diff -q <(sort -u file2) <(grep -Fxf file2 file1 | sort -u)

কোন আউটপুট উত্পাদন করা হবে যদি file1থাকে সব লাইন মধ্যে file2এবং স্থিতি সাথে প্রস্থানের 0, অন্যথায় এটি ভালো কিছু প্রিন্ট হবে

Files /proc/self/fd/11 and /proc/self/fd/12 differ

এবং স্থিতি দিয়ে প্রস্থান করুন 1


2

পাইথন প্রোগ্রামটি ব্যবহার করুন:

#!/usr/bin/env python3
import sys

def open_arg(path):
    return sys.stdin if path == '-' else open(path)

def strip_linebreak(s):
    return s[:-1] if s.endswith('\n') else s

with open_arg(sys.argv[1]) as pattern_file:
    patterns = set(map(strip_linebreak, pattern_file))

with open_arg(sys.argv[2]) as dataset_file:
    for l in map(strip_linebreak, dataset_file):
        patterns.remove(l)
        if not patterns:
            break

sys.exit(int(bool(patterns)))

ব্যবহার:

python3 contains-all.py file2 file1

প্রোগ্রামের প্রস্থান স্থিতি নির্দেশ করে যে ফাইল 2 এর সমস্ত নিদর্শন মিলেছিল:

  • 0 (সাফল্য) এর অর্থ সমস্ত নিদর্শন মিলেছিল।
  • 1 (ব্যর্থতা) এর অর্থ কিছু প্যাটার্নগুলি মেলেনি।

একটি শেল (স্ক্রিপ্ট) মধ্যে প্রস্থান অবস্থা অনুসন্ধান করার জন্য আপনি হয় ব্যবহার করতে পারেন $?বিশেষ পরিবর্তনশীল বা অন্যান্য অভিব্যক্তি কমান্ড প্রস্থান অবস্থা নির্ণয় করা, যেমন শর্ট সার্কিট অপারেটার &&এবং ||মত শর্তাধীন অভিব্যক্তি ifবা while। উদাহরণ:

if python3 compare-all.py file2 file1 && some-other --condition; then
    # do stuff
fi

1

combineথেকে moreutils আপনি সব লাইন দেখান হবে file2যে হয় না file1সঙ্গে

combine file2 not file1

তারপরে আপনি এটির পাইপ দিয়ে লাইনের সংখ্যা গণনা করতে wc -lপারেন:

if [ $(combine file2 not file1 | wc -l) != 0 ]; then
  echo "lines missing"
else
  echo "You're fine"
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.