Bash 使用grep从同一行的选项列表中返回两个实例

Bash 使用grep从同一行的选项列表中返回两个实例,bash,grep,Bash,Grep,我有一些格式的数据 abc,def 其中abc和def是相互链接的域名 我有一个我感兴趣的域的列表(abc、def和ghi),需要找到列表中任意两个同时提到的实例。即返回: abc,def def,abc abc,ghi ... abc,abc def,def (which do occur) 但不是 abc,xyz 我还需要返回: abc,def def,abc abc,ghi ... abc,abc def,def (which do occur) 我尝试使用: grep

我有一些格式的数据

abc,def
其中abc和def是相互链接的域名

我有一个我感兴趣的域的列表(abc、def和ghi),需要找到列表中任意两个同时提到的实例。即返回:

abc,def
def,abc
abc,ghi
...
abc,abc  
def,def (which do occur)
但不是

abc,xyz
我还需要返回:

abc,def
def,abc
abc,ghi
...
abc,abc  
def,def (which do occur)
我尝试使用:

grep -e 'abc\|def\|ghi' filename.csv | grep -e 'abc\|def\|ghi'
但这失败了,大概是因为我犯了一些逻辑上的荒谬,但我看不出它是什么


我正在编写一个用于Gitbash for Windows的.sh脚本

grep -E "([,]?(abc|def|ghi)){2}"
应该有用。您可以扩展[,]以覆盖空白或任何其他垃圾


这一行将查找括号内提到的两种情况,这是可选的逗号,然后是您感兴趣的关键字列表中的一个。

这里的关键是将您想要看到的名称存储在列中,然后检查所有列是否匹配其中任何一列:

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

非常感谢!由于我的列表很短,@artur biesiadowski的解决方案效果很好,但如果我的列表较长,我会采用你的方法,@PeterWebster,它解决了你的问题吗?既然你是新来的,如果你的问题已经解决了,请别忘了把答案标为“接受”。您可以点击答案旁边的复选标记,将答案从空心切换为绿色。看看你有什么问题!