如何使用sed
组合多个过滤器?
这是我的数据集
sex,city,age male,london,32 male,manchester,32 male,oxford,64 female,oxford,23 female,london,33 male,oxford,45
我想识别包含MALE AND OXFORD的所有行。这是我的方法:
sed -n '/male/,/oxford/p' file
由于
答案 0 :(得分:4)
您可以将块与第一个检查相关联,然后将第二个检查放在那里。例如:
sed -n '/male/ { /oxford/ p; }' file
或反转检查和行动:
sed '/male/!d; /oxford/!d' file
但是,由于(正如@Jotne指出的那样)包含female
的行也包含male
,并且您可能不希望匹配它们,因此至少应修改模式以包含字边界:
sed -n '/\<male\>/ { /\<oxford\>/ p; }' file
sed '/\<male\>/!d; /\<oxford\>/!d' file
但是,由于这看起来像逗号分隔的数据并且检查可能不是为了测试是否有人去了male
大学,最好使用更严格的检查awk:
awk -F, '$1 == "male" && $2 == "oxford"' file
这不仅检查一行是否包含male
和oxford
,还检查它们是否在相应的字段中。通过使用
sed '/^male,oxford,/!d' file
答案 1 :(得分:1)
您可以使用awk
awk -F, '/\<male\>/ && /\<oxford\>/' file
male,oxford,64
male,oxford,45
它使用单词锚来防止对女性的打击。
答案 2 :(得分:0)
可以使用单个sed
命令命令来解决此问题。我们来看看使用sed
的两种变体:
$ sed -e 's/^\(male,oxford,.*\)$/\1/;t;d' file
male,oxford,64
male,oxford,45
$ sed -e 's/^male,oxford,\(.*\)$/\1/;t;d' file
64
45
两者都具有基本相同的regex
:
^male,oxford,.*$
有趣的功能是捕获组放置(整行或只是年龄部分)以及使用;t;d
来丢弃不匹配的行。
通过这种方式,我们可以避免使用awk
或grep
来解决此问题。