Command-Line
如何遍歷文件並使每一行成為一個新的正則表達式成為一個 awk 語句?
文件A.txt:
ATGCATGC GGGGGGTT TTTTT AAAA
文件B.txt:
asdfasdf blah2 ATGCATGC blah3 blah4 delte-me-too GGGGGGTT blah5 blah5 ....
我想比較 FileA.txt 中的每一行並檢查它是否在 FileB.txt 中。如果它在 FileB 中,我想刪除以下內容:
- 匹配線
- 上面一行
- 下面兩行
並輸出到一個新文件中。
注意: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