"Ungrep" - hangi modeller eşleşmiyor


13

Aşağıdakileri yapmak için bir komut veya komut dosyası arıyorum - verilen:

file1.txt:

abcd
efgh 
ijkl
mnop

file2.txt:

123abcd123
123efgh123
123mnop123

Böyle bir şey yapan bir komut istiyorum:

ungrep file1.txt file2.txt

ve aşağıdakileri döndürür:

ijkl

Başka bir deyişle bana file1.txt dosyasında file2.txt dosyasında herhangi bir sonuç döndürmeyecek satırlar veriyor. Bunu file1.txt yoluyla yineleyerek, her satır için file2.txt selamlayarak ve sonucu saklayarak ve sonucun boş olduğu herhangi bir satır çıktısıyla yapabileceğimi biliyorum, ancak bunu yapmanın daha verimli bir yolunu umuyordum.

Yanıtlar:


18

GNU grepile aşağıdakiler çalışmalıdır. -fSeçeneği kullanarak, file1.txt"kalıp dosyası" olarak iletin - ancak ikinci kez veri dosyası olarak aktarın. -oYalnızca eşleşen parçaları bildirmek için kullanın . Son olarak, sadece bir kez eşleşen kelimeleri çıkarır - bunlar, file1.txtiçinde bir eşleşme bulamayan satırlara karşılık gelir file2.txt.

grep -h -o -f  file1.txt file2.txt file1.txt | sort | uniq -u
ijkl

Çok iyi bir açıklama. Teşekkürler ve +1.
unxnut

4
Grep hilesi olmadan aynı etkiyi elde edebilirsiniz: sort file1.txt <(grep -of file1.txt file2.txt) | uniq -uancak, çözümünüz gibi, bu sadece desen dosyası aslında herhangi bir normal ifade meta karakteri içermediğinde çalışır.
rici

@rici, bu çok iyi bir nokta
iruvar

2
Geliştirme:grep -oFf file1.txt file2.txt | sort file1.txt - | uniq -u
Stéphane Chazelas

10

Bunu şu şekilde yapabilirsiniz awk:

awk '
  NR == FNR {w[$0]; next}
  {for (i in w) if (index($0,i)) delete w[i]}
  END {for (i in w) print i}' file1.txt file2.txt

Kullanarak index, normal ifadeleri eşleştirmek yerine alt dizeler arıyoruz.

Bir eşleşme bulur bulmaz kelimeyi diziden sildiğimiz için gereksiz aramalardan kaçınırız.


1
Bunu sadece kabul ederdim. Herhangi bir O (n log n) sınıflandırmasını çağırmaz ve desenler regex meta karakterleri içerdiğinde garip bir şekilde başarısız olmaz ve regex'leri desteklemek için genişletilebilir.
Kaz

Sadece değerlendirmenin w[$0]diziye anahtar ekleme yan etkisi olduğuna inanamıyorum .
Kaz

1
@Kaz, evet bu kafa karıştırıcı olabilir ve örneğin if (a[$1])yerine yerine bilerek dizi öğelerini bilerek dağıtmayan birçok komut dosyası bulursunuz if ($1 in a). awkOrijinali de içeren her biri için geçerli awkve nawkdün standarda baktığımda, onu bulamadım.
Stéphane Chazelas

1
@Kaz İşte POSIX alıntısı: "Uygulama, in operatörü ile kullanılan çok boyutlu bir dizinin parantez içinde olmasını sağlar. Belirli bir dizi öğesinin varlığını test eden in operatörü bu öğenin var olmasına neden olmaz. var olmayan bir dizi elemanına yapılan diğer atıflar onu otomatik olarak oluşturur. " Bir paragraf ya iki yukarı kaydırarak bulunabilir burada .
jw013

1
Çok file1büyük olmadığı sürece (çok büyük bir değer için), herhangi bir sıralama gerektirmediği file2ve çok daha verimli olması beklendiği için bu çözümü tercih ederim .
jw013
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.