Awk

通過bash中的stdin管道從文件中刪除行

  • February 26, 2018

使用此腳本:

awk '{print $0"\t"NR}' test | grep NA | awk '{print $21}'

我得到文件中的行號,其中包含“NA”

326
399
672
1512
1734
1737
2212

使用sed,我可以在最後一個 awk 命令之後通過標準輸入在同一命令中從我的文件中刪除這些行嗎?如果沒有,有沒有辦法以簡單的方式做到這一點?

把它寫成一個awk命令會不會太無聊?

awk '!/NA/' test 

預設操作是針對print整行,因此這!/NA/ { print $0 }與列印任何不包含NA.

更簡單的方法是僅使用sed

sed '/NA/d' test >test.new

如果您想使用 GNU 進行就地編輯sed(這將修改文件test):

sed -i '/NA/d' test

sed表達式/NA/dd在輸入中與正則表達式匹配的所有行上應用該命令NA。該d命令刪除行。


如果行號是您擁有的,那麼以下內容也可以:

some_command | sed 's/$/d/' | sed -f /dev/stdin test >output

wheresome_command生成要從文件中刪除的行號test

第一個通過在每一行添加 a 將sed數字流轉換為sed腳本。d行讀數100d將被解釋為“刪除第 100 行”。然後將其sed作為實際腳本饋送到第二個腳本(它正在通過 讀取腳本/dev/stdin)並將其應用於文件test

知道程序替換的shell中的等價物:

sed -f <( some_command | sed 's/$/d/' ) test >output

但是,如果您只想刪除包含 string 的行,那就太愚蠢了NA

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