Metin dosyaları çıkarmak için unix aracı?


16

Büyük bir tablo şeklinde noktalı virgülle ayrılmış metin alanlarından oluşan büyük bir dosya var. Sıralandı. Aynı metin alanlarından oluşan daha küçük bir dosyam var. Bir noktada, birisi bu dosyayı başkalarıyla birleştirdi ve daha sonra yukarıda açıklanan büyük dosyayı oluşturmak için bir sıralama yaptı. Küçük dosyanın satırlarını büyük olandan çıkarmak istiyorum (yani küçük dosyadaki her satır için, büyük dosyada eşleşen bir dize varsa, büyük dosyadaki bu satırı silin).

Dosya kabaca şöyle

GenericClass1; 1; 2; NA; 3; 4;
GenericClass1; 5; 6; NA; 7; 8;
GenericClass2; 1; 5; NA; 3; 8;
GenericClass2; 2; 6; NA; 4; 1;

vb

Bunu yapmanın hızlı ve şık bir yolu var mı yoksa awk kullanmak zorunda mıyım?

Yanıtlar:


28

Kullanabilirsiniz grep. Küçük dosyayı giriş olarak verin ve eşleşmeyen satırlar bulmasını söyleyin:

grep -vxFf file.txt bigfile.txt > newbigfile.txt

Kullanılan seçenekler:

   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched.  (-F is specified by
          POSIX.)
   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

   -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v
          is specified by POSIX.)
   -x, --line-regexp
          Select only those matches that exactly match the whole line.  
          (-x is specified by POSIX.)

Güzel, mükemmel çalıştı. Çok teşekkürler.
Escher

1
Çalışması harika, ama bana göre -x, küçük dosyadaki bir satırın ana dosyadaki başka bir satırın bir alt dizesi olması durumunda , seçenekle daha iyi olurdu . Ayrıca, @ UlrichSchwarz'ın cevabının daha hızlı olması da mümkündür.
rici

18

comm senin arkadaşın:

NAME comm - iki sıralı dosyayı satır satır karşılaştır

SYNOPSIS comm [OPTION] ... DOSYA1 DOSYA2

AÇIKLAMA Sıralı dosyaları FILE1 ve FILE2 satır satır karşılaştırır.

   With  no  options, produce three-column output.  Column one contains lines unique to FILE1, column two contains
   lines unique to FILE2, and column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)

( sıralamayı hesaba kattığı için commmuhtemelen bir performans avantajı olacaktır grep.)

Örneğin:

comm -1 -3 file.txt bigfile.txt > newbigfile.txt

2
Sıralı listeler için comm over grep kullanma hakkında iyi bir nokta. comm -1 -3 file.txt bigfile.txt > newbigfile.txt
Steve Midgley

Yukarıda bildirilen grep komutunu yaklaşık 100MB'lık dosyalarla denediğimi ve "öldürüldü" hatası aldığımı onaylıyorum. Comm ile deneme başarıyla tamamlandı.
Gianluca Casati

Komut yeniden yönlendirme, sıralanmamış dosyalar için veya ikiden fazla dosyaya ihtiyacınız varsa kullanışlıdır:comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)
odinho - Velmont
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.