Grep
grep 循環:我使用一個文件的每一行作為查詢來查找匹配另一個文件。為什麼我的輸出不一致?
我有一個
query_ids
包含幾行的文件,例如:id1 id2 id3
我
grep idx
用來查找 id 中的匹配項my_file
。我將這些匹配項重定向到一個新
matches
文件。我還使用
grep
with 選項-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 通過 do
grep id3 missing
並且grep id3 my_file
兩者都返回匹配項。<br>為什麼我的程式碼將 id3 分配給
mismatches
文件?
- 我嘗試刪除周圍的引號,
$i
但並沒有改變結果。- 我還試圖
echo "$i"
確保 id 實際上是循環的。我錯過了什麼?
您所做的是獲得一個 ID,例如
id1
,然後將與該 ID 匹配的所有行提取到matches
. 然後將所有不匹配的行提取到missing
.對於下一個 ID ,
id2
然後將匹配該 ID 的行添加到matches
,並將不匹配的行添加id2
到missing
。現在,
missing
包含所有不包含的行id1
,然後是所有不包含的行id2
。請注意,包含id1
不包含的id2
行將missing
來自循環的第二次迭代。相反,一次考慮所有 ID:
grep -f query_ids -Fw my_file >matches grep -f query_ids -Fw -v my_file >missing
在這裡,我提供
grep
了query_ids
使用-f
. 我要求grep
將其中的行query_ids
視為查詢字元串(-F
,即不是正則表達式),並將它們my_file
作為整個單詞進行匹配(-w
,因此id2
不匹配 egid23
)。第一個命令將提取包含任何 ID 的所有行。第二個命令將提取所有不包含任何 ID 的行。
這裡不需要任何類型的循環。