Bash

如何使用搜尋模式文件在 csv 的最後一列中搜尋確切的單詞?

  • August 27, 2020

此問題作為單獨的主題進行介紹,但我無法讓所有內容一起工作。

我有一個 tsv 文件,這是一個範例行:(file1)

NODE_1_length_45927_cov_22.029055_g0_i0 WP_055195622.1  93.1    729     50      0       291     2477    1       729     0.0e+00 1275.4  166486;1897048

最後一個欄位包含一個數字列表,以 . 分隔;

我有一個包含搜尋模式列表的文件(file2):

33090
3041
1897
97100
97101
166486

我想輸出包含搜尋模式的行:

  1. 只有最後一個欄位
  2. 最後一個欄位中的任何數字,用 ; 分隔 可以匹配,但它們必須與模式完全匹配

到目前為止,我最好的嘗試是

awk 'NR==FNR{a[$1]; next} {for (i in a) if ($NF ~ i) print $0}' file2 file1 

但是,這包括部分匹配,例如 1897 將匹配第二個不應該的數字

我使用 gawk 正則表達式嘗試了許多變體來匹配整個單詞:

awk 'NR==FNR{a[$1]; next} {for (i in a) if ($NF ~ '/\yi\y/') print $0}' file2 file1
awk 'NR==FNR{a[$1]; next} {for (i in a) if ($NF ~ '/[^[:alpha:]]i[^[:alpha:]]/') print $0}' file2 file1

但都沒有輸出。

任何 bash 解決方案都會很棒,無論多麼醜陋 - 但是我無法用循環解決這個問題,因為我有 12 個文件,每個文件有 2000 萬行,所以它需要快速

任何幫助深表感謝。

awk 'NR==FNR{a[$1];next}{n=split($NF,b,";");for(i=1;i<=n;i++){if(b[i] in a){print;break}}}' file2 file1

解壓版:

awk '
 NR==FNR{a[$1];next}
 {
   n=split($NF,b,";")
   for(i=1;i<=n;i++){
     if(b[i] in a){print;break}
   }
 }   
' file2 file1

split($NF,b,";")拆分分號上的最後一個欄位並將結果放入b數組中。b它返回分配給的元素的數量n。在您的範例行中n=2b[1]=166486b[2]=1897048

if(b[i] in a){print;break}如果完全匹配,則列印該行並打破循環,以免重複列印同一行。

引用自:https://unix.stackexchange.com/questions/606423