Grep

grep 循環:我使用一個文件的每一行作為查詢來查找匹配另一個文件。為什麼我的輸出不一致?

  • April 13, 2021

我有一個query_ids包含幾行的文件,例如:

id1
id2
id3

grep idx用來查找 id 中的匹配項my_file

我將這些匹配項重定向到一個新matches文件。

我還使用grepwith 選項-v來獲取重定向到mismatches文件的所有不匹配項。我正在使用這個小腳本:

#!/bin/bash


for i in $(cat query_ids)
do 
   # saving matches 
   grep "$i" my_file >> matches
   # saving mismatches
   grep -v "$i" my_file >> missing
done

我顯然做錯了:當從文件中

手動搜尋一些 id 時,我發現它們存在。 即使該文件應該只包含文件中未找到的id,我確實找到了匹配項。missing``my_file
missing``query_ids``my_file

因此,當選擇一些隨機 id 時,讓我們說 id3 通過 dogrep id3 missing並且grep id3 my_file兩者都返回匹配項。<br>

為什麼我的程式碼將 id3 分配給mismatches文件?

  1. 我嘗試刪除周圍的引號,$i但並沒有改變結果。
  2. 我還試圖echo "$i"確保 id 實際上是循環的。

我錯過了什麼?

您所做的是獲得一個 ID,例如id1,然後將與該 ID 匹配的所有行提取到matches. 然後將所有匹配的行提取到missing.

對於下一個 ID ,id2然後將匹配該 ID 的行添加到matches,並將不匹配的行添加id2missing

現在,missing包含所有不包含的行id1,然後是所有不包含的行id2。請注意,包含id1不包含的id2行將missing來自循環的第二次迭代。

相反,一次考慮所有 ID:

grep -f query_ids -Fw    my_file &gt;matches
grep -f query_ids -Fw -v my_file &gt;missing

在這裡,我提供grepquery_ids使用-f. 我要求grep將其中的行query_ids視為查詢字元串(-F,即不是正則表達式),並將它們my_file作為整個單詞進行匹配(-w,因此id2不匹配 eg id23)。

第一個命令將提取包含任何 ID 的所有行。第二個命令將提取所有不包含任何 ID 的行。

這裡不需要任何類型的循環。

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