Grep 仅数据 (-o) 和第一列

Wol*_*olf 4 grep text-processing csv

样本数据

wolf@linux:~$ cat data.csv 
A,4.4.4.4,4.4.4.5,4.4.4.6,3.3.3.3,3.3.3.4
B,1.1.1.1,1.1.1.1,1.1.1.2,1.1.1.3,3.3.3.3
C,1.1.1.1,1.1.1.1,1.1.1.1,1.1.1.1,1.1.1.1
D,2.2.2.1,2.2.2.1,2.2.2.2,2.2.2.3,2.2.2.4
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

此样本中有一些重复数据。例如,有两个3.3.3.3位于 A 行和 B 行。

wolf@linux:~$ egrep 3.3.3.3 data.csv 
A,4.4.4.4,4.4.4.5,4.4.4.6,3.3.3.3,3.3.3.4
B,1.1.1.1,1.1.1.1,1.1.1.2,1.1.1.3,3.3.3.3
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

现在我只对第一列A,B,C,D以及相关数据感兴趣。

这是我需要查找的 4 个数据。

2.2.2.3
3.3.3.3
4.4.4.4
5.5.5.5
Run Code Online (Sandbox Code Playgroud)

所以,我在 egrep 中使用|-o

wolf@linux:~$ egrep '2.2.2.3|3.3.3.3|4.4.4.4|5.5.5.5' data.csv
A,4.4.4.4,4.4.4.5,4.4.4.6,3.3.3.3,3.3.3.4
B,1.1.1.1,1.1.1.1,1.1.1.2,1.1.1.3,3.3.3.3
D,2.2.2.1,2.2.2.1,2.2.2.2,2.2.2.3,2.2.2.4
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

输出很好,但是里面的数据太多了。我只想要相关数据和第一列。

所以,这是另一个尝试 -o

wolf@linux:~$ egrep -o '2.2.2.3|3.3.3.3|4.4.4.4|5.5.5.5' data.csv
4.4.4.4
3.3.3.3
3,3.3.3
2.2.2.3
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

现在的问题是我无法A/B/C/D用这个获得第一列 ( )

下次尝试

wolf@linux:~$ egrep '2.2.2.3|3.3.3.3|4.4.4.4|5.5.5.5' data.csv | cut -d , -f 1
A
B
D
wolf@linux:~$
Run Code Online (Sandbox Code Playgroud)

我得到第一列,但不是数据。通过查看输出,我不知道A代表两者3.3.3.34.4.4.4因为它没有显示在输出上。

那不是我真正想要的输出。我现在想到的是这样的

期望输出

输入

2.2.2.3
3.3.3.3
4.4.4.4
5.5.5.5
Run Code Online (Sandbox Code Playgroud)

输出

D       2.2.2.3   
A,B     3.3.3.3
A       4.4.4.4
-       5.5.5.5
Run Code Online (Sandbox Code Playgroud)

不幸的是,我现在想不出解决方案。请帮忙

Sun*_*eep 5

$ cat script.awk
NR == FNR {
  a[$0]
  next
}

{
  for (i = 2; i <= NF; i++) {
    for (k in a) {
      if ($i == k) {
        a[k] = a[k] ? a[k] "," $1 : $1
      }
    }
  }
}

END {
  for (k in a) {
    print a[k] "\t" k
  }
}
Run Code Online (Sandbox Code Playgroud)

运行它:

$ cat search.txt
2.2.2.3
3.3.3.3
4.4.4.4
5.5.5.5

$ awk -F, -f script.awk search.txt data.csv
A,B     3.3.3.3
D       2.2.2.3
A       4.4.4.4
        5.5.5.5
Run Code Online (Sandbox Code Playgroud)