Bash
如何使用搜尋模式文件在 csv 的最後一列中搜尋確切的單詞?
此問題作為單獨的主題進行介紹,但我無法讓所有內容一起工作。
我有一個 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
我想輸出包含搜尋模式的行:
- 只有最後一個欄位
- 最後一個欄位中的任何數字,用 ; 分隔 可以匹配,但它們必須與模式完全匹配
到目前為止,我最好的嘗試是
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=2
,b[1]=166486
和b[2]=1897048
。
if(b[i] in a){print;break}
如果完全匹配,則列印該行並打破循環,以免重複列印同一行。