मैं शेल स्क्रिप्ट के साथ दो फ़ाइलों की तुलना कैसे करूं?


10

दो फ़ाइलों को देखते हुए, मैं एक शेल स्क्रिप्ट लिखना चाहता हूं जो फ़ाइल 1 से प्रत्येक पंक्ति को पढ़ती है और यह जांचती है कि क्या यह फ़ाइल 2 में है। यदि कोई लाइन नहीं मिली है तो इसे आउटपुट करना चाहिए दो फाइलें अलग-अलग हैं और बाहर निकलती हैं। फ़ाइलों में शब्द संख्या या कुछ भी हो सकते हैं। उदाहरण के लिए :

फ़ाइल 1:

Hi!
1234
5678
1111
hello

करें 2:

1111
5678
1234
Hi!
hello

इस मामले में दो फाइलें बराबर होनी चाहिए। अगर file2 में "hello !!!" "हैलो" के बजाय फिर फाइलें अलग हैं। मैं बैश स्क्रिप्ट का उपयोग कर रहा हूं। मैं यह कैसे कर सकता हूँ। यह महत्वपूर्ण नहीं है कि मुझे इसे नेस्टेड लूप में करने की आवश्यकता है, लेकिन मुझे लगता है कि यह एकमात्र तरीका है। आपकी सहायता के लिए धन्यवाद।

जवाबों:


9

बैश में:

diff --brief <(sort file1) <(sort file2)

क्या होगा अगर फ़ाइल एक सीएसवी फ़ाइल है। क्या अब भी छँटाई होगी?
0x0

sortजब तक आप इसे नहीं बताते तब तक सटीक सामग्री की परवाह नहीं करता।
इग्नासियो वाज़केज़-अब्राम्स

क्या यह पता लगाना संभव है कि कौन सी रेखाएं भिन्न हैं?
0x0

निकालें --briefऔर प्रारूप विकल्प जोड़ें, जैसे -u
इग्नासियो वाज़केज़-अब्राम्स

10

diffयदि फ़ाइल समान हैं या नहीं, यह इंगित करने के लिए इसकी निकास स्थिति सेट करता है। निकास चर विशेष चर में सुलभ है $?। आप इस तरह से इग्नासियो के जवाब पर विस्तार कर सकते हैं:

diff --brief <(sort file1) <(sort file2) >/dev/null
comp_value=$?

if [ $comp_value -eq 1 ]
then
    echo "do something because they're different"
else
    echo "do something because they're identical"
fi

3
आप बस if diff ... >/dev/nullकोष्ठक और चर के बिना कर सकते हैं ।
अगली सूचना तक रोक दिया गया।

1

इसे जोड़ना क्योंकि मुझे लगता है कि [[]] और& || निर्माण बहुत साफ है:

#!/bin/bash

[[ `diff ${HOME}/file1 ${HOME}/file2` ]] &&  
   (echo "files different") ||
   (echo "files same")

1

भी काम करना चाहिए:

comm -3 file1 file2

मुझे लगता है कि यह एक उत्तर के लिए पर्याप्त वर्ण है ...


1

Whilst diffएक पूरी तरह से ठीक जवाब है, मैं शायद cmpबजाय जो दो फ़ाइलों की बाइट तुलना द्वारा एक बाइट करने के लिए विशेष रूप से उपयोग होता है।

https://linux.die.net/man/1/cmp

इस वजह से, इसमें बाइनरी फ़ाइलों की तुलना करने में सक्षम होने का अतिरिक्त बोनस है।

if cmp -s "file1" "file2"
then
   echo "The files match"
else
   echo "The files are different"
fi

मुझे विश्वास है कि यह उपयोग करने की तुलना में तेज़ है, diffहालांकि मैंने व्यक्तिगत रूप से इसका परीक्षण नहीं किया है।


"फाइलें अलग हैं" मामला पहले नहीं जाएगा? यदि परीक्षण पूछता है कि क्या कुछ सत्य है, अर्थात, एक नॉनज़रो रिटर्न कोड। यदि फ़ाइलें मेल खाती हैं, तो cmp रिटर्न 0 (प्रति पेज), और इसी तरह दूसरा मामला होना चाहिए।
user8162

@ user8162 आप जो कहते हैं वह समझ में आता है, हालाँकि मैंने अभी इसका परीक्षण किया है और यह सही तरीका है। मुझे यकीन नहीं है कि ईमानदार होने के लिए ऐसा क्यों है।
रिचर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.