यूनिक्स कमांड की जाँच करें कि क्या किसी फाइल में दो लाइनें समान हैं?


24

क्या एक यूनिक्स कमांड है जो यह जांच सकता है कि क्या किसी फाइल में दो लाइनें समान हैं?

उदाहरण के लिए किसी फ़ाइल पर विचार करें sentences.txt

This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

हम देखते हैं कि वाक्य

This is sentence X

दोहराया जाता है।

क्या कोई ऐसा आदेश है जो जल्दी से इसका पता लगा सकता है, ताकि मैं शायद इसे इस तरह निष्पादित कर सकूं -

$ cat sentences.txt | thecommand
Line 1:This is sentence X
Line 4:This is sentence X

जवाबों:


40

यहाँ सटीक उत्पादन प्राप्त करने का एक तरीका है:

$ grep -nFx "$(sort sentences.txt | uniq -d)" sentences.txt 
1:This is sentence X
4:This is sentence X

स्पष्टीकरण:

आंतरिक $(sort sentences.txt | uniq -d)प्रत्येक पंक्ति को सूचीबद्ध करता है जो एक से अधिक बार होती है। बाहरी इनमें से किसी भी रेखा के लिए सटीक मिलान के लिए grep -nFxफिर से दिखता है और अपनी लाइन संख्या को प्रस्तुत करता हैsentences.txt-x-F-n


आपके संपादन ने ठीक उसी उत्तर को पोस्ट करने से मुझे बमुश्किल हरा दिया। +1
केसी

तो $ (कमांड) सिंटैक्स एक तरह के प्रतिस्थापन के रूप में काम करता है?
कोडब्लू

2
@ कोडब्लू - हाँ। इसे कमांड प्रतिस्थापन
grebneke

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txtथोड़ा और कुशल होगा और संभावित arg list too longसमस्याओं से बच जाएगा ।
स्टीफन चेजलस

10

ठीक वैसा नहीं जैसा आप चाहते हैं, लेकिन आप संयोजन की कोशिश कर सकते हैं sortऔर uniq -c -d:

aularon@aularon-laptop:~$ cat input
This is sentence X
This is sentence Y
This is sentence Z
This is sentence X
This is sentence A
This is sentence B

aularon@aularon-laptop:~$ sort input | uniq -cd
      2 This is sentence X
aularon@aularon-laptop:~$ 

2यहाँ लाइन के लिए पाए जाने वाले दोहरावों की संख्या है man uniq:

   -c, --count
          prefix lines by the number of occurrences

   -d, --repeated
          only print duplicate lines

6

यदि फ़ाइल सामग्री मेमोरी में फिट awkहोती है, तो इसके लिए अच्छा है। Comp.lang.awk में मानक वन-लाइनर (मैं इस मशीन से एक उदाहरण नहीं खोज सकता, लेकिन हर महीने कई हैं) बस पता लगाने के लिए दोहराव है awk 'n[$0]++'जो प्रत्येक पंक्ति मान की घटनाओं को गिनता है और किसी भी घटना को प्रिंट करता है (s) पहले के अलावा, क्योंकि डिफ़ॉल्ट कार्रवाई है print $0

अपने स्वरूप में प्रथम सहित सभी घटनाओं को दिखाने के लिए, लेकिन संभवतः मिश्रित क्रम में जब एक से अधिक मूल्य डुप्लिकेट किए जाते हैं, तो थोड़ा और अधिक बारीक हो जाता है:

awk <sentences.txt ' !($0 in n) {n[$0]=NR;next} \
    n[$0] {n[$0]=0; print "Line "n[$0]":"$0} \
    {print "Line "NR":"$0} '

स्पष्टता के लिए कई लाइनों में दिखाया गया है, आप आमतौर पर वास्तविक उपयोग में एक साथ चलते हैं। यदि आप ऐसा करते हैं, तो आप awkस्क्रिप्ट को किसी फ़ाइल स्क्रिप्ट में awk -fपूरी तरह से या निश्चित रूप से एक फ़ाइल में रख सकते हैं । सबसे सरल की तरह awkयह भी इसी तरह से किया जा सकता है perl -n[a]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.