Linux

如何通過輸入文件從文本文件中刪除列中具有特定值的行?

  • September 9, 2018

我有一個管道分隔文件,如下所示。

數據.txt

ESP|041336|46566|NY|CA
ESP|041337|46566|NY|CA
ESP|041338|46566|NY|CA
ESP|041339|46566|NY|CA
ESP|041340|46566|NY|CA
ESP|041341|46566|NY|CA

我有另一個文件,其中第二列中的值需要刪除。

輸入.txt

041337
041338
041339

我正在嘗試從 input.txt 的第二列中刪除具有值的行。

預期產出

ESP|041336|46566|NY|CA
ESP|041340|46566|NY|CA
ESP|041341|46566|NY|CA

我試圖在下面使用 grep 來實現這一點。

grep -vfw input.txt data.txt > output.txt

這不會刪除列,但會引發錯誤 No such file or directory 並返回一個空文件。

如果您只想將比較限制為第二個分隔欄位,則可以使用 awk 而不是 grep:

$ awk -F'|' 'NR==FNR {a[$1]++; next} !($2 in a)' input.txt data.txt > output.txt

$ cat output.txt
ESP|041336|46566|NY|CA
ESP|041340|46566|NY|CA
ESP|041341|46566|NY|CA

該選項-f需要一個文件名。按照你的寫法,文件名是f, in後面的文本-vfw,換句話說就是w.

您必須在最後放置一個帶有參數的選項(除了tar,它使用奇怪的選項解析)。

這些中的任何一個都應該起作用。

grep -v -w -f input.txt data.txt > output.txt
grep -vwf input.txt data.txt > output.txt
grep -vwfinput.txt data.txt > output.txt

注意:確切的錯誤消息,當您提出問題時應始終完整引用,提及名稱w

grep: w: 沒有這樣的文件或目錄

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