Amacınız ortak veya yaygın olmayan satırlar bulmaksa, comm
buradaki go-to komutum olacaktır.
İki dosyayı karşılaştırır ve (üç sütunda) dosya 1'e özgü satırları, dosya 2'ye özgü satırları ve her iki dosyada da görünen satırları gösterir. Bu çıktılardan herhangi birini bastırmak için bayrakları geçirebilirsiniz. Örneğin comm -1 file1 file2
, birinci sütunu, dosya1'e özgü şeyleri bastıracaktır. comm -12 file1 file2
yalnızca her iki dosyada da bir şeyler gösterirdi.
Büyük bir uyarı var: giriş sıralanmalıdır. Bu sorunu çözebiliriz.
Bu size mno'da olmayan abc'deki her şeyi gösterecektir:
comm -23 <(sort abc.txt) <(sort mno.txt)
Ve wc -l
saymak için bunu aktarabilirsiniz .
Birlikte çalışmamın nedeni comm
, dosyalar sıralandığında, yan yana karşılaştırmanın hesaplamalı olarak gerçekten basit olmasıdır. Milyonlarca insanla uğraşıyorsanız, bu bir fark yaratacaktır.
Bu birkaç sahte dosya ile gösterilebilir. Oldukça hızlı bir bilgisayarım var, bu yüzden yaklaşımlar arasındaki farkı göstermek için oldukça mamut örnek setine ihtiyacım var. Dosya başına 10 milyon 10 karakterlik dizeye gittim.
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > abc.txt
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > mno.txt
$ time comm -23 <(sort abc.txt) <(sort mno.txt) | wc -l
... 0m10.653s
$ time grep -Fcxv -f abc.txt mno.txt
... 0m23.920s
$ time grep -Fcwv -f abc.txt mno.txt
... 0m40.313s
$ time awk 'NR==FNR{a[$0]++};NR!=FNR && a[$0]' abc.txt mno.txt | wc -l
... 0m12.161s
Sıralama benim için çoğu zaman gereken şeydir. Abc.txt dosyasının statik olduğunu iddia edersek, önceden sıralayabiliriz ve bu da gelecekteki karşılaştırmaları çok daha hızlı yapar:
$ sort abc.txt abc-sorted.txt
$ time comm -23 abc-sorted.txt <(sort mno.txt) | wc -l
... 0m7.426s
Bunlara bakıp birkaç saniye ilgisiz olduğunu düşünebilirsiniz, ancak bunların üst düzey bir makinede çalıştığını vurgulamak zorundayım. Bunu (örneğin) bir Raspberry Pi 3 üzerinde yapmak istiyorsanız, çok daha yavaş dönüşlere bakacaksınız ve fark gerçekten önemli olan bir noktaya yükselecektir.
grep -cxvFf abc.txt mno.txt
?