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

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

列表1:

1,name1                   
2,name2                    
3,name3                  
4,name4                   
5,name5                  
6,name6                  
7,name7                  
8,name8                  
9,name9                  

列表2:

3
13
14
6
1
7
15
26

我需要像这样的输出:

2,name
4,name
5,name
8,name
9,name

输出应包含第 1 列中的项目列表1哪些不在列表2

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

答案1

假设bash使用(否则,使用 and 预先对输入文件进行排序sort -o List1 List1,并sort -o List2 List2使用List1 List2而不是过程替换):

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

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

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

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

对于 MySQL 解决方案,您必须为所涉及的表提供 SQL 架构,但生成的查询将类似于

SELECT * FROM table1 WHERE joinfield1 NOT IN (SELECT joinfield2 FROM table2);

答案2

使用grep

grep -wvf List2 List1

输出:

2,name2
4,name4
5,name5
8,name8
9,name9

答案3

尝试这个,

awk -F ',' 'NR==FNR{a[$1]++;next};a[$1] == 0'  List2  List1

2,name2                    
4,name4                   
5,name5                  
8,name8                  
9,name9
  • a[$1]++; next:它将第一个字段保存在数组中。然后,
  • a[$1] == 0:只有当这是第二个文件时,else 块才会被执行,因此我们检查该文件的字段 1 是否已被看到 ( a[$1]==0)。

相关内容