如果所有字段都与特定模式匹配,则删除一行

时间:2016-07-12 08:04:48

标签: bash awk

如果我想在一个字段中删除具有特定模式的行,例如第三个字段,我可以写:

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,没有例外。

感谢。

3 个答案:

答案 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