列表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
)。