【发布时间】:2015-05-30 23:24:41
【问题描述】:
如何使用sed 组合多个过滤器?
这是我的数据集
性别、城市、年龄 男性,伦敦,32 男,曼彻斯特,32 男,牛津,64 女性,牛津,23 女性,伦敦,33 男,牛津,45
我想识别所有包含 MALE AND OXFORD 的行。这是我的方法:
sed -n '/male/,/oxford/p' file
谢谢
【问题讨论】:
标签: unix command-line sed
如何使用sed 组合多个过滤器?
这是我的数据集
性别、城市、年龄 男性,伦敦,32 男,曼彻斯特,32 男,牛津,64 女性,牛津,23 女性,伦敦,33 男,牛津,45
我想识别所有包含 MALE AND OXFORD 的行。这是我的方法:
sed -n '/male/,/oxford/p' file
谢谢
【问题讨论】:
标签: unix command-line sed
您可以使用awk
awk -F, '/\<male\>/ && /\<oxford\>/' file
male,oxford,64
male,oxford,45
它使用锚这个词来防止撞到女性。
【讨论】:
您可以将块与第一个检查相关联,然后将第二个放入其中。例如:
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 也可以达到同样的效果,但不那么漂亮
sed '/^male,oxford,/!d' file
【讨论】:
female。
MALE AND OXFORD获取行一样,但是对于他的数据集应该没问题。
sed '/^male,oxford,/!d' file 为我工作。如果数据集看起来像sex,city,agemale,london,32 male,manchester,32 male,oxford,64 female,oxford,23 female,london,33 male,oxford,45,为什么它不适用于 csv 文件
awk -F, 'tolower($1) == "male" && tolower($2) == "oxford"' file。
可以使用单个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来解决这个问题。
【讨论】: