Công cụ trong unix để trừ tập tin văn bản?


16

Tôi có một tệp lớn bao gồm các trường văn bản được phân tách bằng dấu chấm phẩy dưới dạng bảng lớn. Nó đã được sắp xếp. Tôi có một tệp nhỏ hơn bao gồm các trường văn bản tương tự. Tại một số điểm, một người nào đó đã nối tệp này với người khác và sau đó thực hiện một cách sắp xếp để tạo thành tệp lớn được mô tả ở trên. Tôi muốn trừ các dòng của tệp nhỏ khỏi tệp lớn (nghĩa là đối với mỗi dòng trong tệp nhỏ, nếu một chuỗi phù hợp tồn tại trong tệp lớn, hãy xóa dòng đó trong tệp lớn).

Các tập tin trông như thế này

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

Vân vân

Có một cách nhanh chóng để làm điều này hoặc tôi phải sử dụng awk?

Câu trả lời:


28

Bạn có thể sử dụng grep. Cung cấp cho nó tệp nhỏ làm đầu vào và bảo nó tìm các dòng không khớp:

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

Các tùy chọn được sử dụng là:

   -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.)

Đẹp, làm việc hoàn hảo. Cảm ơn rất nhiều.
Escher

1
Thật tuyệt khi nó hoạt động, nhưng đối với tôi, nó có vẻ tốt hơn với -xtùy chọn, trong trường hợp một dòng trong tệp nhỏ hơn xảy ra với tôi một chuỗi con của một dòng khác trong tệp chính. Ngoài ra, rất có thể câu trả lời của @ UlrichSchwarz nhanh hơn.
2014

18

comm là bạn của bạn:

NAME comm - so sánh hai tệp được sắp xếp theo từng dòng

TRIỆU CHỨNG comm [TÙY CHỌN] ... FILE1 FILE2

MÔ TẢ So sánh các tệp được sắp xếp FILE1 và FILE2 theo từng dòng.

   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)

( commcó thể sẽ có lợi ích về hiệu suất hơn grepvì nó tính đến sự sắp xếp.)

Ví dụ:

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

2
Điểm hay về việc sử dụng comm trên grep cho các danh sách được sắp xếp. Đây sẽ là một câu trả lời tốt hơn nếu bạn đưa ra một ví dụ dòng lệnh cụ thể nhưcomm -1 -3 file.txt bigfile.txt > newbigfile.txt
Steve Midgley

Tôi xác nhận rằng tôi đã thử lệnh grep được báo cáo ở trên với các tệp khoảng 100 MB và tôi đã gặp lỗi "bị giết". Cố gắng với comm nó đã hoàn thành thành công.
Gianluca Casati

Chuyển hướng lệnh hữu ích cho các tệp chưa được sắp xếp hoặc nếu bạn cần nhiều hơn hai tệp:comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)
odinho - Velmont
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.