我有一些格式为
的数据abc,def
其中abc和def是相互链接的域名。
我有一个我感兴趣的域名列表(abc,def和ghi),需要查找列表中任何两个一起提到的实例。那是回归:
abc,def
def,abc
abc,ghi
...
但不是
abc,xyz
我还需要回复:
abc,abc
def,def (which do occur)
我尝试使用:
grep -e 'abc\|def\|ghi' filename.csv | grep -e 'abc\|def\|ghi'
但这失败了,大概是因为我犯了一些逻辑荒谬,但我看不出它是什么。
我正在编写一个.sh脚本,用于Gitbash for Windows。
答案 0 :(得分:1)
我认为像
这样的东西grep -E "([,]?(abc|def|ghi)){2}"
应该有效。你可以扩展[,]来覆盖你周围的空白或任何其他垃圾。
此行将查找括号内提到的2个事件,这是之前的可选逗号,然后是您感兴趣的关键字列表之一。
答案 1 :(得分:0)
这里的关键是存储您想要在列中查看的名称,然后检查所有列是否与其中任何列匹配:
awk -F, -v patt="abc def ghi"
'BEGIN {
split(patt,names," "); # store data in array
for (i in names) n[names[i]]=names[i] # store in indexes
}
($1 in n) && ($2 in n) ' file # check if present
看到它的实际效果:
$ cat a
abc,def
def,abc
abc,ghi
abc,abc
abc,xyz
xyz,123
$ awk -F, -v patt="abc def ghi" 'BEGIN {split(patt,names," "); for (i in names) n[names[i]]=names[i]} ($1 in n) && ($2 in n) ' a
abc,def
def,abc
abc,ghi
abc,abc