কিভাবে দুটি ফাইল তুলনা করতে


83

সুতরাং মূলত আমি যা করতে চাই তা হ'ল কলাম 2 দিয়ে দুটি ফাইলের তুলনা করে আমি কীভাবে এটি সম্পাদন করতে পারি?

File_1.txt:

User1 US
User2 US
User3 US

File_2.txt:

User1 US
User2 US
User3 NG

আউটপুট ফাইল:

User3 has changed

11
ব্যবহারdiff "File_1.txt" "File_2.txt"
পান্ড্য 15

এছাড়াও দেখুন: Askubuntu.com/q/12473
পান্ড্য

উত্তর:


92

দেখব diffকমান্ড। এটি একটি ভাল সরঞ্জাম এবং আপনি man diffআপনার টার্মিনালটিতে টাইপ করে এগুলি সম্পর্কে সমস্ত কিছু পড়তে পারেন ।

আপনি যে কমান্ডটি করতে চাইবেন তা হ'ল diff File_1.txt File_2.txtযা দুজনের মধ্যে পার্থক্য আউটপুট তৈরি করবে এবং এর মতো দেখতে হবে:

এখানে চিত্র বর্ণনা লিখুন

তৃতীয় কমান্ড থেকে আউটপুট পড়ার জন্য একটি দ্রুত নোট: 'তীর' ( <এবং >) রেখাটির বাম ফাইলটিতে ( <) বনাম ডান ফাইল ( >) বনাম যে ফাইলটি আপনি প্রবেশ করেছেন সেটিকে বোঝায় প্রথমে কমান্ড লাইনে, এই ক্ষেত্রেFile_1.txt

অতিরিক্তভাবে আপনি দেখতে পাচ্ছেন ৪ র্থ কমান্ডটি হ'ল diff ... | tee Output_Fileএই পাইপগুলি থেকে ফলাফলগুলি এ diffরূপান্তরিত হয় teeযা এরপরে আউটপুটটিকে কোনও ফাইলে রাখে, যাতে আপনি পরে যদি এটি কনসোলে ঠিক দেখতে না চান তবে পরে সংরক্ষণ করতে পারবেন।


এটি কি অন্যান্য ফাইলগুলি (যেমন চিত্রগুলি) করতে পারে? নাকি এটি কেবল নথিপত্রের মধ্যে সীমাবদ্ধ?
গ্রেগরি অপেরা

2
আমি যতদূর জানি, এটি টেক্সট ফাইলগুলির মধ্যে সীমাবদ্ধ। কোডটি মূলত পাঠ্য হিসাবে কাজ করবে, তবে কোনও বাইনারি ফাইল (যা চিত্রগুলি) কেবল জাঙ্ক আউট হবে। আপনি যদি তারা করে অভিন্ন করছেন তা দেখতে তুলনা করতে পারবেন: diff file1 file2 -s। এখানে একটি উদাহরণ রয়েছে: imgur.com/ShrQx9x
মিচ

আউটপুট রঙিন করার উপায় আছে? আমি এটিকে কেবল সিএলআই-র রাখতে চাই, তবে আরও কিছু মানুষের সাথে ...
লাজার লজুবেনভীć

36

অথবা আপনি মাইল্ড ডিফ ব্যবহার করতে পারেন

ফিল্ড আপনাকে ফাইল, ডিরেক্টরি এবং সংস্করণ নিয়ন্ত্রিত প্রকল্পগুলির তুলনা করতে সহায়তা করে। এটি ফাইল এবং ডিরেক্টরি উভয়ের উভয় এবং ত্রি-উপায়ে তুলনা সরবরাহ করে এবং অনেক জনপ্রিয় সংস্করণ নিয়ন্ত্রণ সিস্টেমের জন্য সমর্থন করে।

চালিয়ে ইনস্টল করুন:

sudo apt-get install meld

আপনার উদাহরণ:

এখানে চিত্র বর্ণনা লিখুন

ডিরেক্টরি তুলনা:

এখানে চিত্র বর্ণনা লিখুন

পাঠ্য পূর্ণ সহ উদাহরণ:

এখানে চিত্র বর্ণনা লিখুন


18

আপনি ভিমডিফ ব্যবহার করতে পারেন ।

উদাহরণ:

vimdiff  file1  file2

1
এটির রঙ রয়েছে
জেক টরন্টো

এটি আমার প্রথম ফাইলের লাইন শেষ dosএবং দ্বিতীয়টি দ্বিতীয়টি দেখায় বলে এটি আমাকে সহায়তা করেছিল unix
LoMaPh

13

এফডাব্লুআইডাব্লু, আমি তার চেয়ে বেশি পছন্দ করি যা আমি ডফর থেকে পাশাপাশি পাশের আউটপুট দিয়ে পাই

diff -y -W 120 File_1.txt File_2.txt

কিছু দিতে হবে:

User1 US                            User1 US
User2 US                            User2 US
User3 US                          | User3 NG

10

আপনি কমান্ডটি ব্যবহার করতে পারেন cmp:

cmp -b "File_1.txt" "File_2.txt"

আউটপুট হবে

a b differ: byte 25, line 3 is 125 U 116 N

cmpdiffআপনি চান সমস্ত কি রিটার্ন কোডের চেয়ে অনেক দ্রুত ।
স্টিভস্লিভা

8

Meldসত্যিই দুর্দান্ত সরঞ্জাম is তবে আপনি diffuseদুটি ফাইলকে দর্শনীয়ভাবে তুলনা করতেও ব্যবহার করতে পারেন :

diffuse file1.txt file2.txt

এখানে চিত্র বর্ণনা লিখুন


7

লিটারেরালি প্রশ্নের সাথে আঁকড়ে থাকা (ফাইল 1, ফাইল 2, আউটপুটফাইলে "পরিবর্তিত হয়েছে" বার্তা) নীচের স্ক্রিপ্টটি কাজ করে।

স্ক্রিপ্টটি একটি ফাঁকা ফাইলে অনুলিপি করুন, এটি সংরক্ষণ করুন, কার্যকর হিসাবে কার্যকর করুন compare.py, কমান্ড দিয়ে চালান:

/path/to/compare.py <file1> <file2> <outputfile>

এই পান্ডুলিপি:

#!/usr/bin/env python

import sys
file1 = sys.argv[1]; file2 = sys.argv[2]; outfile = sys.argv[3]

def readfile(file):
    with open(file) as compare:
        return [item.replace("\n", "").split(" ") for item in compare.readlines()]

data1 = readfile(file1); data2 = readfile(file2)
mismatch = [item[0] for item in data1 if not item in data2]

with open(outfile, "wt") as out:
    for line in mismatch:
        out.write(line+" has changed"+"\n")

কয়েকটি অতিরিক্ত লাইন দিয়ে, আপনি আউটপুটফাইলে সংজ্ঞায়িত করা হয় কিনা তার উপর নির্ভর করে এটি কোনও আউটপুটফাইলে, বা টার্মিনালে মুদ্রণ করতে পারেন:

একটি ফাইল মুদ্রণ করতে:

/path/to/compare.py <file1> <file2> <outputfile>

টার্মিনাল উইন্ডোতে মুদ্রণ করতে:

/path/to/compare.py <file1> <file2> 

এই পান্ডুলিপি:

#!/usr/bin/env python

import sys

file1 = sys.argv[1]; file2 = sys.argv[2]
try:
    outfile = sys.argv[3]
except IndexError:
    outfile = None

def readfile(file):
    with open(file) as compare:
        return [item.replace("\n", "").split(" ") for item in compare.readlines()]

data1 = readfile(file1); data2 = readfile(file2)
mismatch = [item[0] for item in data1 if not item in data2]

if outfile != None:
        with open(outfile, "wt") as out:
            for line in mismatch:
                out.write(line+" has changed"+"\n")
else:
    for line in mismatch:
        print line+" has changed"

4

একটি সহজ উপায় হ'ল ব্যবহার করা colordiff, যা এর মতো আচরণ করে diffতবে এর আউটপুটটিকে রঙিন করে। এটি ভিন্নতা পড়ার জন্য খুব সহায়ক helpful আপনার উদাহরণ ব্যবহার করে,

$ colordiff -u File_1.txt File_2.txt
--- File_1.txt  2016-12-24 17:59:17.409490554 -0500
+++ File_2.txt  2016-12-24 18:00:06.666719659 -0500
@@ -1,3 +1,3 @@
 User1 US
 User2 US
-User3 US
+User3 NG

যেখানে uবিকল্পটি একটি ইউনিফাইড দেয়। বর্ণযুক্ত ডিফটি দেখতে কেমন:

এখানে চিত্র বর্ণনা লিখুন

colordiffচালিয়ে ইনস্টল করুন sudo apt-get install colordiff


1
আপনি যদি রং চান তবে আমি ডিএমএফটি
বিলম্বিতভাবে দেখতে

2

অতিরিক্ত উত্তর

যদি ফাইলগুলির অংশগুলির মধ্যে পার্থক্য রয়েছে তা জানার দরকার নেই তবে আপনি ফাইলটির চেকসাম ব্যবহার করতে পারেন। এটি করার অনেক উপায় আছে md5sumবা ব্যবহার করে sha256sum। মূলত, তাদের প্রত্যেকটি একটি স্ট্রিং আউটপুট করে যা একটি ফাইলের সামগ্রী হ্যাশ করে। দুটি ফাইল যদি একই হয় তবে তাদের হ্যাশও একই হবে। আপনি প্রায়শই সফ্টওয়্যার ডাউনলোড করার সময় এটি ব্যবহার করা হয় যেমন উবুন্টু ইনস্টলেশন আইসো চিত্র। এগুলি প্রায়শই ডাউনলোড করা সামগ্রীর অখণ্ডতা যাচাই করার জন্য ব্যবহৃত হয়।

নীচের স্ক্রিপ্টটি বিবেচনা করুন, যেখানে আপনি দুটি ফাইলকে আর্গুমেন্ট হিসাবে দিতে পারেন এবং ফাইলটি সেগুলি একই কিনা তা আপনাকে জানায়।

#!/bin/bash

# Check if both files exist  
if ! [ -e "$1"  ];
then
    printf "%s doesn't exist\n" "$1"
    exit 2
elif ! [ -e "$2" ]
then
    printf "%s doesn't exist\n" "$2"
    exit 2
fi

# Get checksums of eithe file
file1_sha=$( sha256sum "$1" | awk '{print $1}')
file2_sha=$( sha256sum "$2" | awk '{print $1}')

# Compare the checksums
if [ "x$file1_sha" = "x$file2_sha" ]
then
    printf "Files %s and %s are the same\n" "$1" "$2"
    exit 0
else
    printf "Files %s and %s are different\n" "$1" "$2"
    exit 1
fi

নমুনা রান:

$ ./compare_files.sh /etc/passwd ./passwd_copy.txt                                                                
Files /etc/passwd and ./passwd_copy.txt are the same
$ echo $?
0
$ ./compare_files.sh /etc/passwd /etc/default/grub                                                                
Files /etc/passwd and /etc/default/grub are different
$ echo $?
1

পুরানো উত্তর

এছাড়াও commকমান্ড রয়েছে যা দুটি বাছাই করা ফাইলের তুলনা করে এবং 3 টি কলমে আউটপুট দেয়: # 1 ফাইলের জন্য আইটেমের জন্য কলাম 1, ফাইল # 2-তে আইটেমের জন্য কলাম 2 এবং উভয় ফাইলে উপস্থিত আইটেমগুলির জন্য কলাম 3।

যে কোনও কলামটি দমন করতে আপনি সুইচ -1, -2, এবং -3 ব্যবহার করতে পারেন। -3 ব্যবহার করে ভিন্ন লাইনগুলি প্রদর্শিত হবে।

বেলো আপনি কমান্ডের স্ক্রিনশটটিকে কার্য করতে দেখতে পাচ্ছেন।

এখানে চিত্র বর্ণনা লিখুন

একটি মাত্র প্রয়োজনীয়তা আছে - ফাইলগুলি সঠিকভাবে তুলনা করার জন্য তাদের অবশ্যই বাছাই করতে হবে। sortকমান্ড যে উদ্দেশ্যে ব্যবহার করা যেতে পারে। বেলো হ'ল আরেকটি স্ক্রিনশট, যেখানে ফাইলগুলি সাজানো হয় এবং তারপরে তুলনা করা হয়। বাম দিক থেকে শুরু হওয়া লাইনগুলি কেবল ফাইল_1 এ শুরু হবে, কলাম 2 থেকে শুরু হওয়া লাইনগুলি কেবল ফাইল_2 এর অন্তর্গত

এখানে চিত্র বর্ণনা লিখুন


@ ডেভিডফোরস্টার মোবাইলে সম্পাদনা করা খুব কষ্টকর :) এখনই হয়ে গেছে
সের্গি কোলোডিয়াজনি

2

গিট ইনস্টল করুন এবং ব্যবহার করুন

$ git diff filename1 filename2

এবং আপনি সুন্দর রঙিন বিন্যাসে আউটপুট পাবেন

গিট ইনস্টলেশন

$ apt-get update
$ apt-get install git-core

2

colcmp.sh

বিন্যাসে 2 টি ফাইলের মধ্যে নাম / মান জোড়ার তুলনা করে name value\n। লিখেছেন nameকরতে Output_fileযদি পরিবর্তন করেছেন। সহযোগী অ্যারেগুলির জন্য ব্যাশ ভি 4 + প্রয়োজন ।

ব্যবহার

$ ./colcmp.sh File_1.txt File_2.txt
User3 changed from 'US' to 'NG'
no change: User1,User2

আউটপুট ফাইল

$ cat Output_File
User3 has changed

উত্স (colcmp.sh)

cmp -s "$1" "$2"
case "$?" in
    0)
        echo "" > Output_File
        echo "files are identical"
        ;;
    1)
        echo "" > Output_File
        cp "$1" ~/.colcmp.array1.tmp.sh
        sed -i -E "s/([^A-Za-z0-9 ])/\\\\\\1/g" ~/.colcmp.array1.tmp.sh
        sed -i -E "s/^(.*)$/#\\1/" ~/.colcmp.array1.tmp.sh
        sed -i -E "s/^#\\s*(\\S+)\\s+(\\S.*?)\\s*\$/A1\\[\\1\\]=\"\\2\"/" ~/.colcmp.array1.tmp.sh
        chmod 755 ~/.colcmp.array1.tmp.sh
        declare -A A1
        source ~/.colcmp.array1.tmp.sh

        cp "$2" ~/.colcmp.array2.tmp.sh
        sed -i -E "s/([^A-Za-z0-9 ])/\\\\\\1/g" ~/.colcmp.array2.tmp.sh
        sed -i -E "s/^(.*)$/#\\1/" ~/.colcmp.array2.tmp.sh
        sed -i -E "s/^#\\s*(\\S+)\\s+(\\S.*?)\\s*\$/A2\\[\\1\\]=\"\\2\"/" ~/.colcmp.array2.tmp.sh
        chmod 755 ~/.colcmp.array2.tmp.sh
        declare -A A2
        source ~/.colcmp.array2.tmp.sh

        USERSWHODIDNOTCHANGE=
        for i in "${!A1[@]}"; do
            if [ "${A2[$i]+x}" = "" ]; then
                echo "$i was removed"
                echo "$i has changed" > Output_File
            fi
        done
        for i in "${!A2[@]}"; do
            if [ "${A1[$i]+x}" = "" ]; then
                echo "$i was added as '${A2[$i]}'"
                echo "$i has changed" > Output_File
            elif [ "${A1[$i]}" != "${A2[$i]}" ]; then
                echo "$i changed from '${A1[$i]}' to '${A2[$i]}'"
                echo "$i has changed" > Output_File
            else
                if [ x$USERSWHODIDNOTCHANGE != x ]; then
                    USERSWHODIDNOTCHANGE=",$USERSWHODIDNOTCHANGE"
                fi
                USERSWHODIDNOTCHANGE="$i$USERSWHODIDNOTCHANGE"
            fi
        done
        if [ x$USERSWHODIDNOTCHANGE != x ]; then
            echo "no change: $USERSWHODIDNOTCHANGE"
        fi
        ;;
    *)
        echo "error: file not found, access denied, etc..."
        echo "usage: ./colcmp.sh File_1.txt File_2.txt"
        ;;
esac

ব্যাখ্যা

কোডটি ভেঙে দেওয়া এবং এর অর্থ কী, আমার বোঝার সেরা। আমি সম্পাদনা এবং পরামর্শ স্বাগত জানাই।

বেসিক ফাইল তুলনা করুন

cmp -s "$1" "$2"
case "$?" in
    0)
        # match
        ;;
    1)
        # compare
        ;;
    *)
        # error
        ;;
esac

সিএমপি $ এর মান নির্ধারণ করবে ? যেমন অনুসরণ করে :

  • 0 = ফাইল মিলছে
  • 1 = ফাইল পৃথক
  • 2 = ত্রুটি

আমি কেস .. ইস্যাক বিবৃতি al প্রমাণ করতে ব্যবহার করতে বেছে নিয়েছি ? কারণ $ এর মান ? পরীক্ষার ([) সহ প্রতিটি কমান্ডের পরে পরিবর্তন হয়

বিকল্পভাবে আমি vari এর মান ধরে রাখতে কোনও ভেরিয়েবল ব্যবহার করতে পারতাম ? :

cmp -s "$1" "$2"
CMPRESULT=$?
if [ $CMPRESULT -eq 0 ]; then
    # match
elif [ $CMPRESULT -eq 1 ]; then
    # compare
else
    # error
fi

উপরে কেস স্টেটমেন্ট হিসাবে একই জিনিস। আইডিকে যা আমি আরও ভাল পছন্দ করি।

আউটপুট সাফ করুন

        echo "" > Output_File

উপরে আউটপুট ফাইল সাফ করে যদি কোনও ব্যবহারকারী পরিবর্তন না করে তবে আউটপুট ফাইলটি খালি থাকবে।

আমি কেস স্টেটমেন্টের ভিতরে এটি করি যাতে আউটপুট_ফাইলে ত্রুটি অপরিবর্তিত থাকে।

শেল স্ক্রিপ্টে ব্যবহারকারী ফাইল অনুলিপি করুন

        cp "$1" ~/.colcmp.arrays.tmp.sh

বর্তমানের ব্যবহারকারীর বাড়ির দির উপরে ফাইল_1.txt অনুলিপি করুন ।

উদাহরণস্বরূপ, যদি বর্তমান ব্যবহারকারী জন হয় তবে উপরেরটি সিপি "ফাইল_1.txt" / home/john/.colcmp.arrays.tmp.sh এর সমান হবে

বিশেষ অক্ষর পালাতে

মূলত, আমি অদ্ভুত। আমি জানি যে এই অক্ষরগুলির বিশেষ অর্থ হতে পারে বা কোনও বহিরাগত প্রোগ্রাম কার্যকর করতে পারে যখন ভেরিয়েবল অ্যাসাইনমেন্টের অংশ হিসাবে কোনও স্ক্রিপ্টে চালানো হয়:

  • `- ব্যাক-টিক - কোনও প্রোগ্রাম এবং আউটপুট কার্যকর করে যেমন আউটপুটটি আপনার স্ক্রিপ্টের অংশ ছিল
  • $ - ডলার সাইন - সাধারণত একটি পরিবর্তনশীল উপসর্গ
  • $ {} - আরও জটিল পরিবর্তনশীল বিকল্পের জন্য মঞ্জুরি দেয়
  • $ () - আইডিকি এটি কী করে তবে আমি মনে করি এটি কোড কার্যকর করতে পারে

আমি যা জানি না তা হ'ল বাশ সম্পর্কে আমি কতটা জানি না। অন্যান্য চরিত্রগুলির বিশেষ অর্থ কী তা আমি জানি না, তবে আমি ব্যাকস্ল্যাশ দিয়ে সেগুলি থেকে পালাতে চাই:

        sed -i -E "s/([^A-Za-z0-9 ])/\\\\\\1/g" ~/.colcmp.array1.tmp.sh

সেড নিয়মিত এক্সপ্রেশন প্যাটার্ন মিলের চেয়ে আরও অনেক কিছু করতে পারে । স্ক্রিপ্ট প্যাটার্ন "s / (সন্ধান করুন) / (প্রতিস্থাপন) /" বিশেষত প্যাটার্ন ম্যাচটি সম্পাদন করে।

"S / (খোঁজ) / (প্রতিস্থাপন) / (সংশোধনকারীদের)"

ইংরাজীতে: যেকোন বিরামচিহ্ন বা বিশেষ চরিত্রকে ক্যাপিউশন গ্রুপ 1 (1) হিসাবে ক্যাপচার করুন

  • (প্রতিস্থাপন) = \\\\\\ 1

ইংরাজীতে: ব্যাকস্ল্যাশ সহ সমস্ত বিশেষ অক্ষর উপসর্গ করুন

  • (পরিবর্তনকারী) = জি
    • g = বিশ্বব্যাপী প্রতিস্থাপন

ইংরাজীতে: একই লাইনে যদি একাধিক মিল খুঁজে পাওয়া যায়, তবে সেগুলি সব প্রতিস্থাপন করুন

সম্পূর্ণ স্ক্রিপ্ট মন্তব্য করুন

        sed -i -E "s/^(.*)$/#\\1/" ~/.colcmp.arrays.tmp.sh

উপরে বাশ কমেন্টের অক্ষর ( # ) দিয়ে ~ / .colcmp.arrays.tmp.sh এর প্রতিটি লাইন উপসর্গ করতে নিয়মিত অভিব্যক্তি ব্যবহার করা হয় । আমি এটি কারণ কারণ পরে আমি উত্স কমান্ডটি ব্যবহার করে ~ / .colcmp.arrays.tmp.sh সম্পাদন করতে চাইছি এবং কারণ আমি নিশ্চিতভাবে ফাইল_1 . txt এর পুরো ফর্ম্যাটটি জানি না ।

আমি ঘটনাক্রমে স্বেচ্ছাসেবক কোডটি কার্যকর করতে চাই না। আমার মনে হয় না কেউ করে।

"S / (খোঁজ) / (প্রতিস্থাপন) /"

ইংরাজীতে: প্রতিটি লাইনকে ক্যাপিউশন গ্রুপ 1 (1 \\) হিসাবে ক্যাপচার করুন

  • (প্রতিস্থাপন) = # \\ 1

ইংরাজীতে: প্রতি লাইনের প্রতিস্থাপন করুন একটি পাউন্ড প্রতীক এবং তারপরে রেখাটি প্রতিস্থাপন করা হয়েছিল

ব্যবহারকারীর মান A1 [ব্যবহারকারী] = "মান" এ রূপান্তর করুন

        sed -i -E "s/^#\\s*(\\S+)\\s+(\\S.*?)\\s*\$/A1\\[\\1\\]=\"\\2\"/" ~/.colcmp.arrays.tmp.sh

উপরে এই স্ক্রিপ্টটির মূল অংশ রয়েছে।

  • এটিকে রূপান্তর করুন: #User1 US
    • এটি: A1[User1]="US"
    • বা এটি: A2[User1]="US"(২ য় ফাইলের জন্য)

"S / (খোঁজ) / (প্রতিস্থাপন) /"

ইংরেজীতে:

  • নেতৃস্থানীয় মন্তব্য অক্ষর (#) প্রয়োজন তবে এড়ানো প্রয়োজন
  • নেতৃস্থানীয় সাদা স্থান উপেক্ষা করুন
  • প্রথম শব্দটি ক্যাপিউশন গ্রুপ 1 (1 \\) হিসাবে ক্যাপচার করুন
  • একটি স্থান প্রয়োজন (বা ট্যাব, বা সাদা স্থান)
    • যে একটি সমান চিহ্ন সঙ্গে প্রতিস্থাপন করা হবে কারণ
    • এটি কোনও ক্যাপচার গ্রুপের অংশ নয় এবং কারণ
    • (প্রতিস্থাপন) প্যাটার্ন ক্যাপচার গ্রুপ 1 এবং ক্যাপচার গ্রুপ 2 এর মধ্যে সমান চিহ্ন রাখে
  • গ্রুপ 2 হিসাবে ক্যাপচার করুন

  • (প্রতিস্থাপন) = এ 1 \\ [\\ 1 \\] = \ "\\ 2 \"

    • A1 \\ [- আক্ষরিক অক্ষরগুলি A1[অ্যারেতে অ্যারে নিয়োগ শুরু করতে calledA1
    • \\ 1 = ক্যাপচার গ্রুপ 1 - যার মধ্যে শীর্ষস্থানীয় হ্যাশ (#) অন্তর্ভুক্ত নেই এবং শীর্ষস্থানীয় সাদা অংশকে অন্তর্ভুক্ত করে না - এই ক্ষেত্রে ক্যাপচার গ্রুপ 1 ব্যাশ এসোসিয়েটিভ অ্যারেতে নাম / মান জোড়ার নাম সেট করতে ব্যবহৃত হচ্ছে।
    • \\] = \ "= আক্ষরিক অক্ষর ]="
      • ]= অ্যারে অ্যাসাইনমেন্ট বন্ধ করুন যেমন A1[ব্যবহারকারী 1 ]="মার্কিন"
      • = = অ্যাসাইনমেন্ট অপারেটর যেমন ভেরিয়েবল = মান
      • " স্পেস ক্যাপচার করার জন্য = উদ্ধৃতি মান ... যদিও এখন আমি এটি সম্পর্কে চিন্তা করি তবে উপরের কোডটি যে সমস্ত কিছুকে ব্যাকস্ল্যাশ করে স্পেস অক্ষরগুলিকে ব্যাকস্ল্যাশ করতে দেওয়া সহজতর হত।
    • \\ 1 = ক্যাপচার গ্রুপ 2 - এই ক্ষেত্রে, নামের / মান জোড়ার মান
    • "= স্থানগুলি ক্যাপচার করার জন্য ক্লোজারের মান বন্ধ করা

ইংরাজীতে: বিন্যাসে #name valueঅ্যারে অ্যাসাইনমেন্ট অপারেটরের সাথে বিন্যাসের প্রতিটি লাইন প্রতিস্থাপন করুনA1[name]="value"

এক্সিকিউটেবল করুন

        chmod 755 ~/.colcmp.arrays.tmp.sh

উপরে অ্যারে স্ক্রিপ্ট ফাইলটি কার্যকর করার জন্য chmod ব্যবহার করে ।

আমি নিশ্চিত না এটি প্রয়োজনীয় কিনা।

সহযোগী অ্যারে ঘোষণা করুন (ব্যাশ ভি 4 +)

        declare -A A1

মূলধন -A ইঙ্গিত করে যে ঘোষিত ভেরিয়েবলগুলি সংঘবদ্ধ অ্যারে হবে

এই কারণেই স্ক্রিপ্টটির জন্য bash v4 বা ততোধিক প্রয়োজন।

আমাদের অ্যারে ভেরিয়েবল অ্যাসাইনমেন্ট স্ক্রিপ্ট কার্যকর করুন

        source ~/.colcmp.arrays.tmp.sh

আমাদের আগে থেকেই আছে:

  • লাইনের থেকে আমাদের ফাইলটির রূপান্তর User valueলাইনের কাছে A1[User]="value",
  • এটি কার্যকর (সম্ভবত), এবং
  • A1 কে একটি সহযোগী অ্যারে হিসাবে ঘোষণা করেছে ...

বর্তমান শেলটিতে এটি চালনার জন্য আমরা উপরে স্ক্রিপ্টটি উত্স করি। আমরা এটি করি যাতে আমরা স্ক্রিপ্ট দ্বারা সেট করা পরিবর্তনশীল মানগুলি রাখতে পারি। আপনি যদি স্ক্রিপ্টটি সরাসরি চালনা করেন তবে এটি একটি নতুন শেল তৈরি করে এবং যখন নতুন শেলটি বের হয় তখন পরিবর্তনশীল মানগুলি নষ্ট হয়ে যায় বা অন্তত এটি আমার বোধগম্য হয়।

এটি একটি ফাংশন হওয়া উচিত

        cp "$2" ~/.colcmp.array2.tmp.sh
        sed -i -E "s/([^A-Za-z0-9 ])/\\\\\\1/g" ~/.colcmp.array2.tmp.sh
        sed -i -E "s/^(.*)$/#\\1/" ~/.colcmp.array2.tmp.sh
        sed -i -E "s/^#\\s*(\\S+)\\s+(\\S.*?)\\s*\$/A2\\[\\1\\]=\"\\2\"/" ~/.colcmp.array2.tmp.sh
        chmod 755 ~/.colcmp.array2.tmp.sh
        declare -A A2
        source ~/.colcmp.array2.tmp.sh

আমরা thing 1 এবং A1 এর জন্য একই জিনিস করি যা আমরা $ 2 এবং A2 এর জন্য করি । এটি সত্যিই একটি ফাংশন হওয়া উচিত। আমি মনে করি এই মুহুর্তে এই স্ক্রিপ্টটি যথেষ্ট বিভ্রান্তিকর এবং এটি কাজ করে, তাই আমি এটি ঠিক করব না।

ব্যবহারকারীদের সরানো হয়েছে তা সনাক্ত করুন

        for i in "${!A1[@]}"; do
            # check for users removed
        done

সহযোগী অ্যারে কীগুলির মাধ্যমে উপরের লুপগুলি

            if [ "${A2[$i]+x}" = "" ]; then

উপরে ভেরিয়েবল বনাম একটি মানের মধ্যে পার্থক্য সনাক্ত করতে ভেরিয়েবল বিকল্প ব্যবহার করে যা সুস্পষ্টভাবে শূন্য দৈর্ঘ্যের স্ট্রিংয়ে সেট করা হয়েছে vari

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

                echo "$i has changed" > Output_File

উপরে ব্যবহারকারী আউটপুট_ফাইলে adds i যুক্ত করে

ব্যবহারকারীদের যুক্ত বা পরিবর্তন করা হয়েছে তা সনাক্ত করুন

        USERSWHODIDNOTCHANGE=

উপরে একটি ভেরিয়েবল সাফ করে তাই আমরা যে ব্যবহারকারীদের পরিবর্তন হয়নি তাদের ট্র্যাক রাখতে পারি।

        for i in "${!A2[@]}"; do
            # detect users added, changed and not changed
        done

সহযোগী অ্যারে কীগুলির মাধ্যমে উপরের লুপগুলি

            if ! [ "${A1[$i]+x}" != "" ]; then

উপরে ভেরিয়েবল সেট করা হয়েছে কিনা তা দেখতে ভেরিয়েবল বিকল্প ব্যবহার করে ।

                echo "$i was added as '${A2[$i]}'"

কারণ $ i অ্যারে কী (ব্যবহারকারীর নাম) $ এ 2 [$ i] এর বর্তমান ফাইলটির সাথে যুক্ত মানটি ফাইল_2 . txt থেকে ফেরত দেওয়া উচিত

উদাহরণস্বরূপ, যদি $ i ব্যবহারকারী 1 হয়, উপরেরগুলি $ {এ 2 [ব্যবহারকারী 1] as হিসাবে পড়ে

                echo "$i has changed" > Output_File

উপরে ব্যবহারকারী আউটপুট_ফাইলে adds i যুক্ত করে

            elif [ "${A1[$i]}" != "${A2[$i]}" ]; then

কারণ $ i অ্যারে কী (ব্যবহারকারীর নাম) $ এ 1 [$ i] এর বর্তমান ব্যবহারকারী সাথে সম্পর্কিত মানটি ফাইল_1 . txt থেকে ফিরিয়ে দেওয়া উচিত এবং _2 এ 2 [$ i] ফাইল_2 . txt থেকে মানটি ফিরিয়ে আনতে হবে

উপরে উভয় ফাইল থেকে ব্যবহারকারী the i এর জন্য সম্পর্কিত মানগুলি তুলনা করে ..

                echo "$i has changed" > Output_File

উপরে ব্যবহারকারী আউটপুট_ফাইলে adds i যুক্ত করে

                if [ x$USERSWHODIDNOTCHANGE != x ]; then
                    USERSWHODIDNOTCHANGE=",$USERSWHODIDNOTCHANGE"
                fi
                USERSWHODIDNOTCHANGE="$i$USERSWHODIDNOTCHANGE"

উপরে পরিবর্তিত নয় এমন ব্যবহারকারীদের একটি কমা বিচ্ছিন্ন তালিকা তৈরি করে। নোট করুন তালিকার কোনও স্থান নেই, না হলে পরবর্তী চেকটি উদ্ধৃত করা দরকার।

        if [ x$USERSWHODIDNOTCHANGE != x ]; then
            echo "no change: $USERSWHODIDNOTCHANGE"
        fi

উপরে $ USERSWHIDIDNOTCHANGE এর মান প্রতিবেদন করে তবে কেবলমাত্র $ USERSWHODIDNOTCHANGE এ কোনও মান থাকে । এটি যেভাবে লেখা হয়েছে, $ USWWODIDNOTCHANGE এ কোনও স্পেস থাকতে পারে না। যদি এটিতে ফাঁকা স্থানের প্রয়োজন হয় তবে উপরেরটি নীচে পুনরায় লেখা যেতে পারে:

        if [ "$USERSWHODIDNOTCHANGE" != "" ]; then
            echo "no change: $USERSWHODIDNOTCHANGE"
        fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.