Linux

帶有 vfF 的 grep 的 sed 或其他等效項

  • May 5, 2022

RHEL6.10 , gnu grep 2.2

grep -vfF stem.txt source.txt > filteredoutput.txt

stem.txt具有唯一的 13 位數字。

source.txt是固定長度 (400) 數據文件,其中 13 位欄位值從位置 225 開始。欄位值在文件中是唯一的。在這兩種情況下,換行符都是行分隔符。

source.txt有大約 80k 行,stem.txt大約 4.5k

但是,我的輸出文件有大約 75k 行,這意味著它的過濾比干文件中的多。

我不知道為什麼會這樣。

在進行故障排除時,我用空格替換了除數字欄位之外的每一行中的所有其他內容source.txt,然後它給出了正確的結果。非常混亂的行為。

  1. 不知道我怎麼能弄明白?
  2. 我的其他選項是什麼 -sed /awk 等價物。

編輯:萬歲 grep!問題出在使用者/我身上。由於疏忽,我沒有考慮可能出現在源文件其他地方的 13 位特殊序列的可能性。帶有參數的 grep 命令按預期工作。

使用awk,確保您只在它們應該出現的地方尋找那些字元串。

awk '!source {stem[$0]; next}
    ! (substr($0, 225, 13) in stem)
    ' stem.txt source=1 source.txt > filteredoutput.txt

substr()起始位置是從 1 開始的)。

這也將使其效率更高,因為它只需要每行進行一次雜湊查找,source.txt而不是 4.5k 子字元串查找。

注意

grep -vfF stem.txt source.txt

grep -v -f F stem.txt source.txt

(查找文件中的任何正則表達式但不匹配的stem.txt行)。source.txt``F

你可能的意思是:

grep -vFf stem.txt source.txt

(查找source.txt不包含任何字元串的行stem.txt)。

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