Tôi có thể grep hai tập tin với nhau không?


0

Tôi muốn grep tệp A cho mọi cụm từ trong tệp B, trong đó cụm từ là một chuỗi các từ có độ dài X. Lý tưởng nhất, nó sẽ là một grep gần đúng, như thế agrep. Có cách nào để làm điều đó bằng cách sử dụng các công cụ dòng lệnh?

Tập tin:

"Có lần tôi đã nghe một câu chuyện về chuối trong không gian."

Tệp B:

"Nếu có một điều tôi không quan tâm, chuối trong không gian không phải là mối quan tâm đó."

Đầu ra:

Cụm từ "chuối trong không gian" được tìm thấy trong Tệp A dòng 1, tệp B dòng 1.

(và nó có thể làm nổi bật cụm từ trong ngữ cảnh, giống như grep.)

Câu trả lời:


1

Bạn có thể thử những điều sau trong bash:

while read line  
do  
   grep "$line" fileA  
done < fileB

1
Điều đó sẽ grep fileA cho mọi dòng trong fileB, nhưng tôi đang tìm kiếm nó để grep mọi cụm từ.
Jonathan

Bạn có nghĩa là cụm từ ngôn ngữ tự nhiên kết thúc bằng một dấu chấm câu?
nex84

Bất kỳ chuỗi từ. Vì vậy, trong "Tôi thích ăn táo" sẽ có cụm từ "Tôi thích", "Tôi thích", "thích ăn", "ăn táo", v.v.
Jonathan

1

Những gì bạn muốn làm là trên bất kỳ công cụ dòng lệnh nào, nó được thực hiện bởi các chương trình có khả năng tìm kiếm toàn văn bản. Một cái gì đó ít hơn nhiều có thể đạt được bằng cách sử dụng awk:

$ cat fts.awk
{ gsub( /[[:space:],."!?]+/, " ") }

FILENAME == "A" {
   A[++cntA] = $0
   next
}

FILENAME == "B" {
   for ( nrA=1; nrA<=cntA; ++nrA) {
      for ( first=1; first<=NF; ++first) {
         for ( last=first; last<=NF; ++last) {
            lookfor = (last == first) ? $first : lookfor " " $last
            #print "lookfor=", lookfor
            #print "<", A[nrA]
            if ( index(A[nrA], lookfor)) {
               #print "FOUND>", found, nrA, NR
               found = lookfor
            } else if (found) {
               printf "Phrase \"%s\" found in File A line %d, file B line %d.\n",\
                   found, nrA, FNR
               found = ""
               break
            }
         }
      }
   }
}

Có thể được gọi là:

$ awk -f fts.awk A B
Phrase "bananas in space" found in File A line 1, file B line 1.
Phrase "in space" found in File A line 1, file B line 1.
Phrase "space" found in File A line 1, file B line 1.

Như bạn có thể thấy, mã đã trở nên phức tạp, mặc dù hầu như không có bất kỳ danh sách tính năng nào của bạn, nó thậm chí không có bộ nhớ để loại bỏ hiển thị các hàm con.


0

Hãy đơn giản hóa điều này một chút, và sau đó xây dựng theo hướng.

Bạn có thể grep một tệp với các mẫu từ một tệp bằng cách sử dụng tùy chọn -f. Vì vậy, bạn có thể làm một cái gì đó như thế này.

grep -f file_patterns file_haystack

Bạn có thể sử dụng thay thế quy trình để làm cho đầu ra của quy trình hoạt động giống như một tệp

cat <( grep pattern file )

Nếu bạn kết hợp điều này với nhau, bạn có thể grep một tệp dựa trên đầu ra của lệnh grep như thế này.

grep -f <( grep pattern file_a ) file_b

Tôi giả sử bạn có thể tự mình tìm ra bit mẫu, bởi vì nó hoàn toàn không rõ ràng với tôi từ mô tả của bạn, đó là cái gì được cho là.

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.