Awk
通過bash中的stdin管道從文件中刪除行
使用此腳本:
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
預設操作是針對
!/NA/ { print $0 }
與列印任何不包含NA
.
更簡單的方法是僅使用
sed
:sed '/NA/d' test >test.new
如果您想使用 GNU 進行就地編輯
sed
(這將修改文件test
):sed -i '/NA/d' test
該
sed
表達式/NA/d
將d
在輸入中與正則表達式匹配的所有行上應用該命令NA
。該d
命令刪除行。如果行號是您所擁有的,那麼以下內容也可以:
some_command | sed 's/$/d/' | sed -f /dev/stdin test >output
where
some_command
生成要從文件中刪除的行號test
。第一個通過在每一行添加 a 將
sed
數字流轉換為sed
腳本。d
行讀數100d
將被解釋為“刪除第 100 行”。然後將其sed
作為實際腳本饋送到第二個腳本(它正在通過 讀取腳本/dev/stdin
)並將其應用於文件test
。知道程序替換的shell中的等價物:
sed -f <( some_command | sed 's/$/d/' ) test >output
但是,如果您只想刪除包含 string 的行,那就太愚蠢了
NA
。