Khớp mẫu giữa hai tệp trong Linux?


0

Tôi có hai tệp .rtf .... Cái đầu tiên có nội dung này:

Táo, Cam, Chuối, Mì, Chip

Tệp thứ hai là như thế này:

     Apple I love eat Apple.
     Banana I hate Banana.
     Zoo I want to go Zoo.
     Noodle Noodle can be a very very very very very very very very very very very long, but still is one line.
     Chip Don't eat so many chip. 
     Orange Orange is great, not Apple plx. Noodle
     Water Drinking water is boring.

Tệp đầu tiên là "chìa khóa" của tệp thứ hai.

Trong tệp thứ hai, từ đầu tiên là chìa khóa của mỗi dòng.

Mỗi khóa và câu trong tệp thứ hai, CHỈ có một dòng. Tệp thứ hai có nhiều dòng có khóa, nhưng không phải tất cả các khóa đều có trong đó file1, nhưng file1khóa phải PHẢI nằm trong tệp thứ hai.

Làm thế nào tôi có thể nhận được kết quả như thế này: (Cần sắp xếp theo khóa từ file1)

  Apple, Apple I love eat Apple. 
  Orange, Orange is great, not Apple plx.
  Banana, I hate Banana. 
  Noodle, can be a very very very very very very very very very very very long, but still is one sentence. 
  Chip, Don't eat so many chip.

Câu trả lời:


1

Tôi sẽ đưa ra một số giả định (mà bạn dường như đồng ý với câu hỏi của bạn).

  1. Tệp khóa là CSV của các khóa (danh sách các từ khóa được phân tách bằng dấu phẩy)
  2. Tệp dữ liệu có các khóa là những từ đầu tiên bắt đầu từ cột đầu tiên
    • ràng buộc này có thể được quản lý với một số điều nữa trong kịch bản
  3. Tệp dữ liệu không có hai dòng bắt đầu bằng cùng một từ khóa
    • nếu ràng buộc này bị hỏng, bạn sẽ nhận được tất cả các dòng khớp
      khi bạn tìm khóa.
    • có thể được xử lý bằng " | tail -1" để chỉ hiển thị trận đấu đầu tiên (giả sử)
  4. Bạn bắt đầu nói rtfcác tập tin nhưng gắn thẻ câu hỏi là text.
    Nếu bạn có tệp định dạng văn bản có định dạng văn bản, bạn nên chuyển đổi chúng thành tệp văn bản cho mục đích này.

đây là một kịch bản cho bạn,

#! / bin / bash
IFS = ","
# -> để tìm các từ được phân tách bằng dấu phẩy trong key.txt

cho k bằng $ (sed 's | ||' key.txt)
# -----------> để giúp tìm kiếm dễ dàng hơn
làm
  grep "^ $ k" data.txt
# ----> tìm kiếm các từ khóa phù hợp ở đầu mỗi dòng
làm xong

Đây key.txtlà tập tin đầu tiên của bạn và data.txtlà tập tin thứ hai của bạn.
Các forvòng lặp sắp xếp các kết quả theo thứ tự của các phím.
Các sedlệnh loại bỏ bất kỳ dấu cách bạn có thể có trong key.txttập tin để giúp tìm kiếm dễ dàng hơn.

Cập nhật các ký tự không phải tiếng Anh (đó là lý do tại sao có vẻ như bạn nói tệp RTF):
Tìm kiếm iconvvà chuyển RTF của bạn thành UTF-8 - Tôi nghĩ grepcó thể xử lý việc đó.
Nếu đó là những gì bạn muốn làm câu hỏi của bạn nên được viết lại như,

"Làm thế nào để grep trong các tệp có định dạng văn bản có định dạng (trên linux)?"


0

Nếu bạn không cần kết quả được sắp xếp theo thứ tự của keyfile:

sed 's/, /\n/g' keyfile.txt | grep -f - datafile.txt

Để thực hiện việc sắp xếp, bạn có thể làm một cái gì đó như thế này (trong Bash):

sed 's/, /\n/g' keyfile.txt | grep -f - datafile.txt | sort | join -1 2 <(sed 's/, /\n/g' keyfile.txt | nl | sort -k2) - | sort -k2 | cut -d' ' -f1,3-

0

Kịch bản Perl này sẽ làm điều đó:

#!/usr/bin/perl
use strict;
use warnings;

open (my $f1, '<', $ARGV[0]) || die "cannot open $ARGV[0] $!\n";
open (my $f2, '<', $ARGV[1]) || die "cannot open $ARGV[1] $!\n";

my $line=join('',<$f1>);
my @f2=<$f2>;

foreach my $e1 (sort split /, /,$line) {
    foreach my $e2 (@f2) {
        print "$e1, $e2" if ($e2=~/^$e1/);
    }
}

0

Một tùy chọn khác giả sử tệp dữ liệu của bạn là 'data.txt':

for k in Apple Orange Banana Noodle Chip; do echo -n "$k, "; grep "^$k" data.txt; done

Một số câu hỏi trên txt, txt có thể hiển thị một số char / word không phải tiếng Anh không?
user28167
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.