如果我想在一个字段中删除具有特定模式的行,例如第三个字段,我可以写:
awk '$3!='pattern' file
如果我想删除所有字段与特定模式匹配的行,我该怎么办?这是一个示例文件:
number1 1245 1/2 1/2 1/2 1/2
number2 1468 1/1 1/2 2/2 1/2
我想在这种情况下删除第一行,因为第二个字段后面的所有字段都包含1/2
,没有例外。
感谢。
答案 0 :(得分:2)
使用sed
sed '\`^\([^[:space:]]\+[[:space:]]\+\)\{2\}\(1/2[[:space:]]\+\)\+1/2[[:space:]]*$`d' file
带有-r/-E
标志的
sed -r '\`^([^[:space:]]+[[:space:]]+){2}(1/2[[:space:]]+)+1/2[[:space:]]*$`d' file
假设只使用空格而不使用其他空白字符。
sed -r '\`^([^ ]+ +){2}(1/2 +)+1/2 *$`d' file
使用awk
awk '{for(i=3;i<=NF;i++)if($i!="1/2")next;print}' file
打印
number2 1468 1/1 1/2 2/2 1/2
答案 1 :(得分:1)
使用sed
进行简单的面向行的编辑,如下所示:
$ sed '/pattern/d' input
在这种情况下,您要删除连续四次出现&#34; <space>1/2
&#34;的所有行。在最后一行:
$ sed '/\( 1\/2\)\{4\}$/d' input
可替换地,
$ sed -E '/( 1\/2){4}$/d' input
(如果你有GNU sed
,请使用-r
代替-E
。我在BSD系统上使用BSD sed
)
更新:感谢@EdMorton发表评论,您可以通过以下方式摆脱模式中有些丑陋的\/
:
$ sed '\:\( 1/2\)\{4\}$:d' input
或
$ sed -E '\:( 1/2){4}$:d' input
在这种情况下,这可能并不重要,但确保在更复杂的sed
编辑脚本中更容易阅读。
答案 2 :(得分:0)
$ awk '{delete cnt; for (i=3;i<=NF;i++) cnt[$i]++} cnt["1/2"] < length(cnt)' file
number2 1468 1/1 1/2 2/2 1/2