2013-01-23 21 views

cevap

101

kullanmak zorunda komut diff ama comm Varsayılan olarak

comm -23 a.txt b.txt 

değil (ben çok gelecekte başvurmak için belgeleyen Bu sorunun yanıtını bulmak için zaman harcadım) comm çıkışları 3 sütun: yalnızca sol, sağdan yalnızca, her ikisi de. -1, -2 ve -3 anahtarları bu sütunları bastırır.

Yani, -23 sadece ilk (solda) dosyasında görünür çizgiler gösteren sağ yalnızca ve hem sütunları gizler.

hem görünen satırları bulmak istiyorsanız, sadece hem sütununda size bırakarak sol sadece ve sağ yalnızca sütunları gizler -12 kullanabilirsiniz.

+9

Bunu, her iki dosya da sıralıysa çalışır. (Ben biliyorum o dosyaları sıraladı ama birçok kişi, ben dahil, soru başlığı okumak ve daha sonra cevapları atlamak) – user247866

+1

@ user247866: Neyse ki onlar sıralanır eğer söylemek için naziksiniz :) – marlar

20

Basit bir yanıt benim için işe yaramadı çünkü comm hattının hat için eşleştiğini fark etmedim, bu nedenle bir dosyadaki çift satırlar diğerinde olmadığı gibi yazdırılacak. Örneğin, eğer dosya1 içeriyordu:

Alex 
Bill 
Fred 

Ve Dosya2 içeriyordu:

Alex 
Bill 
Bill 
Bill 
Fred 

Sonra çıkış olur comm -13 file1 file2: Benim durumumda

Bill 
Bill 

, bilmek istediğim tek her dize içinde dosya2, her dosyada bu satırın kaç defa gerçekleştiğine bakılmaksızın, dosya1'de mevcuttu.

Çözüm 1: unix.stackexchange dan (ilk "çalışma" cevabı buldum):

comm -13 <(sort -u file1) <(sort -u file2)

Çözüm 2:-u (benzersiz) bayrağı sort için kullandıkları

fgrep -v -f file1 file2

Dosya2 dupli içeriyorsa unutmayın Dosya1, fgrep'da hiç bulunmayan satır çizgileri, yinelenen satırların her birini çıkarır.Ayrıca, tek bir (oldukça büyük) veri kümesi için tek bir dizüstü bilgisayardaki tamamen bilimsel olmayan testlerimin, Çözüm 1'den (comm kullanarak) Çözüm 2'den (fgrep kullanarak) neredeyse 5 kat daha hızlı olduğunu gösterdiğine dikkat edin.

+0

I dosyalarımı uniq ile sıralanmış ve geçti. Her neyse diğer çözümler için teşekkürler. – Sudar

2

Neden diff neden kullanılmadığı söylendiğinden emin değilim. İki dosyayı karşılaştırmak için kullanırdım ve daha sonra sadece soldaki dosyadaki çıktıları değil, doğru olanı çıkarırdım. Böyle hatları böylece dosyaları henüz sıralanabilir olmaz durumunda hat

diff a.txt b.txt | grep \^\< 
+1

Yeni ve değişmeyen satırların yazdırılmasını bastırmak için diff --new-line-format = --unchanged-line-format = a.txt b.txt' kullanabilirsiniz. –

3

başında o sembolü grep yeterli < ile fark tarafından işaretlenmiş, şunları kullanabilirsiniz:

comm -23 <(sort a.txt) <(sort b.txt) 
İlgili konular