有两个列表,想从 list1 中排除 list2

kcm*_*ana 1 shell sed awk perl mysql

列表1

1,name1                   
2,name2                    
3,name3                  
4,name4                   
5,name5                  
6,name6                  
7,name7                  
8,name8                  
9,name9                  
Run Code Online (Sandbox Code Playgroud)

列表2

3
13
14
6
1
7
15
26
Run Code Online (Sandbox Code Playgroud)

我需要这样的输出:

2,name
4,name
5,name
8,name
9,name
Run Code Online (Sandbox Code Playgroud)

输出应包含List1 的第 #1 列中不在List2 中的项目

List1List2未排序,但如果需要,我将对两个列表进行排序。
List1有大约 60,000 条记录,List2 包含 20,0000 条记录。需要使用 Linux shell 或mysql.

Kus*_*nda 5

假设bash使用(否则,使用sort -o List1 List1sort -o List2 List2和使用List1 List2代替进程替换对输入文件进行预排序):

$ join -t, -v1 <( sort List1 ) <( sort List2 )
2,name2
4,name4
5,name5
8,name8
9,name9
Run Code Online (Sandbox Code Playgroud)

这会在您的两个文件之间执行关系 JOIN 操作,首先对它们的内容进行排序。该-t,告诉join对待逗号作为字段分隔符,并与-v1我们要求在不与第二的任何条目加入的第一个文件中的条目。默认情况下,连接发生在每个文件的第一个字段上。

要从中去除最后一个整数:

join -t, -v1 <( sort List1 ) <( sort List2 ) | sed 's/[0-9]*$//'
Run Code Online (Sandbox Code Playgroud)

对于 MySQL 解决方案,您必须为所涉及的表提供 SQL 模式,但结果查询看起来像

SELECT * FROM table1 WHERE joinfield1 NOT IN (SELECT joinfield2 FROM table2);
Run Code Online (Sandbox Code Playgroud)