2 फाइलों में अलग-अलग रेखाओं को अलग-अलग रिपोर्ट करें


14

मेरे पास गीतों की सूची वाली 2 फाइलें हैं। hdsongs.txt और sdsongs.txt

मैंने सभी गीतों और आउटपुट को पाठ फ़ाइलों में सूचीबद्ध करने के लिए एक सरल स्क्रिप्ट लिखी, फिर इसके खिलाफ एक अंतर चलाने के लिए। यह अधिकांश भाग के लिए ठीक काम करता है, लेकिन स्क्रिप्ट में वास्तविक भिन्न कमांड एक ही लाइन को अलग दिखा रहा है। यह वास्तव में कई लाइनों के लिए हो रहा है, लेकिन सभी नहीं।

यहाँ दोनों फाइलों में एक गीत का एक उदाहरण है:

$ grep Apologize \*songs\*
hdsongs.txt:Timbaland/Apologize.mp3
sdsongs.txt:Timbaland/Apologize.mp3

कोई विशेष चरित्र नहीं है जिसे मैं देख सकता हूं:

$ cat -A hdsongs.txt sdsongs.txt | grep Apologize
Timbaland/Apologize.mp3$
Timbaland/Apologize.mp3$

जब मैं अलग-अलग चलता हूं, तो यह एक ही लाइन को प्रत्येक फाइल में दिखाता है; लेकिन लाइनों एक ही नहीं हैं?

$ diff hdsongs.txt sdsongs.txt | grep Apologize
> Timbaland/Apologize.mp3
< Timbaland/Apologize.mp3

यह यहां के धागे के समान है: रिपोर्ट की दो फाइलें अलग-अलग हैं, हालांकि वे समान हैं!

लेकिन यह फ़ाइल के भीतर की पंक्तियों के लिए है, न कि पूरी फ़ाइल के लिए, और वहाँ का रिज़ॉल्यूशन इस मामले में फिट नहीं लगता है।

$ diff <(cat -A phonesongsonly.txt) <(cat -A passportsongsonly.txt) | grep Apologize
< Timbaland/Apologize.mp3$
> Timbaland/Apologize.mp3$

$ wdiff -w "$(tput bold;tput setaf 1)" -x "$(tput sgr0)" -y "$(tput bold;tput setaf 2)" -z "$(tput sgr0)" hdsongs.txt sdsongs.txt | grep Apologize
>Timbaland/Apologize.mp3
>Timbaland/Apologize.mp3

क्या किसी को पता है कि क्यों इस तरह से एक ही लाइन को दो बार रिपोर्ट किया जाएगा?


1
शायद hexdumpउन दो लाइनों की कोशिश करो और देखो क्या अलग है?
user43791

जवाबों:


24

मेरा अनुमान है कि आपने फ़ाइलों को क्रमबद्ध नहीं किया है। यह उन व्यवहारों में से एक है, जिन्हें आप बिना इनपुट के प्राप्त कर सकते हैं:

$ cat file1 
foo
bar
$ cat file2
bar
foo
$ $ diff file1 file2
1d0
< foo
2a2
> foo

लेकिन, यदि आप छाँटते हैं:

$ diff <(sort file1) <(sort file2)
$ 

diffकार्यक्रम की नौकरी में बताने के लिए है कि क्या दो फ़ाइलों समान हैं और, अगर नहीं, वे जहां अलग है। यह विभिन्न लाइनों के बीच समानताएं खोजने के लिए डिज़ाइन नहीं किया गया है। यदि एक फ़ाइल का लाइन X दूसरे के लाइन X के समान नहीं है, तो फ़ाइलें समान नहीं हैं। इससे कोई फर्क नहीं पड़ता कि उनमें ठीक एक ही जानकारी है, यदि वह जानकारी अलग तरीके से व्यवस्थित की जाती है, तो फाइलें अलग-अलग बताई जाती हैं।


4

चूंकि आपने यह नहीं बताया है कि फाइलें क्रमबद्ध हैं, इसलिए मैं मान लूंगा कि वे नहीं हैं। diff जब दोनों फ़ाइलों में एक पंक्ति दिखाई देती है, लेकिन विभिन्न स्थानों में यह अपेक्षित आउटपुट है । यह स्पष्ट होगा यदि आप diffइसके माध्यम से पाइपिंग के बजाय पूरे आउटपुट को देखते हैं grep


2

मेरा सुझाव है कि बाइनरी / हेक्साडेसिमल आउटपुट प्राप्त करने के लिए हेक्सडीफ प्रोग्राम की तरह कुछ का उपयोग करने की कोशिश की जाए, क्योंकि मानव आंख हमेशा पात्रों को कंप्यूटर डिस्प्ले के बीच अंतर नहीं बता सकती है, और कुछ वर्ण प्रदर्शित नहीं हो सकते हैं।


2
cat -Aगैर-मुद्रण वर्णों के अधिकांश (सभी?) मामलों को दिखाया जाएगा। मुझे यकीन नहीं है कि यह यूनिकोड अजनबियों के साथ कैसे तालमेल बैठाएगा लेकिन अन्य गैर-मुद्रण वर्ण दिखाए गए होंगे।
terdon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.