使用SED删除具有多个要匹配的字段的行

时间:2012-10-08 19:11:33

标签: sed

我有一个包含12列数据的文件。如果第5列等于“A”而第12列等于“Z”,我想删除/删除整行。这可能使用SED吗?

3 个答案:

答案 0 :(得分:2)

你可以。假设您的列用空格分隔:

sed -i -e '/\([^ ]* *\)\{4\}A *\([^ ]* *\)\{6\}Z/d' file

-i标志用于编辑文件。

模式[^ ]* *匹配零或更多(由星号表示)不是空格的字符(由括号中的^后面的空格字符表示)后跟零个或多个空格。

在backslashed括号之间放置此模式,我们可以将它分组为单个表达式,然后我们可以使用反斜杠括号来重复表达式。最初四次,然后匹配A后跟空格,然后模式再次重复六次,然后是Z

希望这有助于=)

答案 1 :(得分:2)

您可以使用sed执行此操作,但使用awk会更容易:

awk '! ( $5 == "A" && $12 == "Z" )' input-file

awk '$5 != "A" || $12 != "Z"' input-file

答案 2 :(得分:0)

perl -F -ane 'print unless($F[4] eq "A" and $F[11] eq "Z") your_file

测试如下:

> cat temp
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 A 6 7 8 9 10 11 Z
> perl -F -ane 'print unless($F[4] eq "A" and $F[11] eq "Z")' temp
1 2 3 4 5 6 7 8 9 10 11 12
>