Alat di unix untuk mengurangi file teks?

16

Saya memiliki file besar yang terdiri dari bidang teks yang dipisahkan oleh tanda titik koma dalam bentuk tabel besar. Telah diurutkan. Saya memiliki file yang lebih kecil yang terdiri dari bidang teks yang sama. Pada titik tertentu, seseorang menggabungkan file ini dengan orang lain dan kemudian melakukan semacam untuk membentuk file besar yang dijelaskan di atas. Saya ingin mengurangi garis-garis file kecil dari yang besar (yaitu untuk setiap baris dalam file kecil, jika string yang cocok ada di file besar, hapus baris itu di file besar).

File terlihat seperti ini

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

dll

Apakah ada cara cepat dan berkelas untuk melakukan ini atau saya harus menggunakan awk?

Escher
sumber

Jawaban:

28

Anda bisa menggunakannya grep. Berikan file kecil sebagai input dan katakan padanya untuk menemukan baris yang tidak cocok:

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

Opsi yang digunakan adalah:

   -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.)
terdon
sumber
Bagus, bekerja dengan sempurna. Terima kasih banyak.
Escher
1
Ini keren bahwa itu bekerja, tetapi menurut saya itu akan lebih baik dengan -xopsi juga, kalau-kalau suatu baris dalam file yang lebih kecil terjadi pada saya substring dari baris lain di file utama. Juga, sangat mungkin bahwa jawaban @ UlrichSchwarz lebih cepat.
rici
18

comm adalah temanmu:

NAME comm - bandingkan dua file yang disortir baris demi baris

SYNOPSIS comm [OPTION] ... FILE1 FILE2

DESKRIPSI Bandingkan file yang diurutkan FILE1 dan FILE2 baris demi baris.

   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)

( commmungkin akan memiliki manfaat kinerja grepkarena memperhitungkan penyortiran.)

Sebagai contoh:

comm -1 -3 file.txt bigfile.txt > newbigfile.txt
Ulrich Schwarz
sumber
2
Poin bagus tentang menggunakan comm over grep untuk daftar yang diurutkan. Ini akan menjadi jawaban yang lebih baik jika Anda memberikan contoh baris perintah khusus seperticomm -1 -3 file.txt bigfile.txt > newbigfile.txt
Steve Midgley
Saya mengkonfirmasi bahwa saya mencoba perintah grep yang dilaporkan di atas dengan file sekitar 100MB dan saya mendapat kesalahan "terbunuh". Mencoba dengan comm selesai dengan sukses.
Gianluca Casati
Pengalihan perintah berguna untuk file yang tidak disortir atau jika Anda membutuhkan lebih dari dua file:comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)
odinho - Velmont