Dosyadaki herhangi iki satırın aynı olup olmadığını kontrol etmek için Unix komutu?


24

Dosyadaki iki satırın aynı olup olmadığını kontrol edebilecek bir unix komutu var mı?

Örneğin bir dosya düşünün 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

Cümle görüyoruz

This is sentence X

Tekrarlanır.

Bunu hızlı bir şekilde tespit edebilecek herhangi bir komut var mı, böylece belki de bu şekilde çalıştırabilirim -

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

Yanıtlar:


40

İşte tam aradığınız çıktıyı elde etmenin bir yolu:

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

Açıklama:

İç kısımda $(sort sentences.txt | uniq -d)birden fazla olan her satır listelenir. Dış , bu çizgilerden herhangi biriyle tam eşleşmelere grep -nFxtekrar bakar ve satır numaralarını hazırlarsentences.txt-x-F-n


Düzenlemeniz, tam olarak aynı cevabı göndermemi zorlukla yendi. +1
casey

Öyleyse $ (command) sözdizimi bir tür değiştirme olarak çalışıyor mu?
CodeBlue

2
@KodBlue - evet. Buna Komuta Değiştirme
grebneke

8
sort sentences.txt | uniq -d | grep -nFxf - sentences.txtbiraz daha verimli olur ve potansiyel arg list too longsorunlardan kaçınırdı.
Stéphane Chazelas

10

İstediğiniz, ancak birleştirerek deneyebilirsiniz Tam olarak ne sortve 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:~$ 

2işte satır için bulunan kopya sayısı man uniq:

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

   -d, --repeated
          only print duplicate lines

6

Dosya içeriği belleğe sığıyorsa, awkbunun için iyidir. Comp.lang.awk'taki standart bir liner (bu makineden bir örnek bulamıyorum ancak her ay birkaç tane var) sadece yineleme olduğunu tespit etmek awk 'n[$0]++', her satır değerinin oluşumunu sayan ve herhangi bir oluşum (lar) basan olduğunu tespit etmek içindir. ilki dışında, çünkü varsayılan eylem print $0.

Birincisi de dahil olmak üzere tüm oluşumları biçiminizde, ancak birden fazla değerin kopyalanması durumunda karışık düzende göstermek, biraz daha titiz olur:

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

Netlik için birden fazla satırda gösterilen, genellikle gerçek kullanımda birlikte çalışırsınız. Bunu sık sık yaparsanız, awkbetiği bir dosyaya awk -fveya tabii ki her şeyi bir kabuk betiğine koyabilirsiniz . En basit gibi, awkbu da benzer şekilde yapılabilir perl -n[a].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.