Command-Line

如何遍歷文件並使每一行成為一個新的正則表達式成為一個 awk 語句?

  • February 6, 2016

文件A.txt:

ATGCATGC 
GGGGGGTT
TTTTT
AAAA

文件B.txt:

asdfasdf
blah2
ATGCATGC
blah3
blah4 
delte-me-too
GGGGGGTT
blah5
blah5
....

我想比較 FileA.txt 中的每一行並檢查它是否在 FileB.txt 中。如果它在 FileB 中,我想刪除以下內容:

  1. 匹配線
  2. 上面一行
  3. 下面兩行

並輸出到一個新文件中。

注意:FileA 中將有 500,000 行。我想以一種我們不對模式進行硬編碼的方式來做到這一點。

我目前有一些東西要刪除這些行,但是我對通過 FileA 循環來為這個 awk 表達式創建一個新模式感到困惑:

awk '/$VARIABLE_REGEX/{for(x=NR-2;x<=NR+2;x++)d[x];} {a[NR]=$0}
END{for(i=1;i<=NR;i++)
   if(!(i in d))
       print a[i]}' FileB.txt

注意:沒有錯誤檢查。此外,假設第二個文件中的輸入完全遵循提到的模式。

awk 'NR== FNR {a[$0] = $0 ; next } {if (!($0 in a)) {b[count++] = $0; } else {count--; if (count > 0) delete b[count];getline;getline; }} END {for (i=0; i<count; i++) print b[i] }' 1 2

輸入在 1 和 2

1

ATGCATGC
GGGGGGTT
TTTTT
AAAA

2

asdfasdf
blah2
ATGCATGC
blah3
blah4 
delte-me-too
GGGGGGTT
blah5
blah5
foo
foo-delete
AAAA
bar-delete
bar-delete
bar-ok

輸出

asdfasdf
foo
bar-ok

下一個程式碼不是最佳的(因為它必須讀取FileB.txt兩次)但希望它可以比awk更快

comm --nocheck-order -23 FileB.txt <(grep -B1 -A2 -Ff FileA.txt FileB.txt)

使用新的GNU sed命令e,您可以嘗試(為了節省記憶體)sed + grep

sed 'N;h;s/.*\n//;s/.*/grep -xF "&" FileA.txt/e;/./{N;N;d};x;P;D' FileB.txt

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