【问题标题】:Need to check .CSV's one column against another .CSV one column for matches需要检查 .CSV 的一列与另一 .CSV 的一列是否匹配
【发布时间】:2018-07-24 05:12:56
【问题描述】:

我有一个大约 10,000 行的 CSV。一个字段

.000.000.000
.111.111.111
etc

我需要对照 400,000 行左右的主列表检查上述内容,再次检查所有字段

.0
.1
.3
and up 

最好的方法是什么?我用 -f 尝试了一个 grep 但我觉得它没有做任何事情

grep -f [file1][file2]

它没有返回任何结果,但我也没有给出我认为它需要的输出。

我也尝试了 awk,但它只是我发现的东西,并没有真正理解它。所以再一次没有得到我想要的结果。

awk -F, 'NR>1&&NR==FNR{a[$1];next}FNR>1&&($1 in a){print $1,"in both!"}'

如果可能的话,我想把它做成一个脚本,但如果不是越简单越好。我真的在做这个检查是为了勤奋,但我 90% 确定我的小列表在大文件中没有匹配的行。但是当检查是这种情况时,我需要某种确认。

【问题讨论】:

  • 发布更可测试/扩展的输入样本和预期结果
  • 检查这个:stackoverflow.com/questions/33523362/… 与记事本++一起使用的其他方式
  • Mac 用户听起来不错
  • 当每个文件中只有 1 个字段时,为什么还要将这些文件称为 CSV?要么它们是 CSV,并且您没有与我们分享您的输入文件,要么它们不是 CSV,
  • 它们是具有更多字段的较大文件,但我删除了所有其他字段..所以它只是文件当前保存为的格式..

标签: python csv awk sed grep


【解决方案1】:

grep 似乎应该可以工作。好像grep -Fx -f [searchfile] [matchfile](-F 表示字符串不是正则表达式匹配,-x 强制匹配整行)应该做你想做的事吗?

例如

$ cat grepsearch.txt
000.000
111.111
222.333

$ cat greptest.txt
1
2
41
5
235
15
15
000.000.00
431
5341
643
16
43
000.000
3251235
431
5431
543
1
543
15341
111.111
435143
54
35
43
11111
1111111
11111
111111
0000000
00000
222.333
432
145
3415
431
543

$ grep -F -f grepsearch.txt greptest.txt
000.000
111.111
222.333

注意,如果没有 -F/-x,. 将被解释为正则表达式:

$ grep -f grepsearch.txt greptest.txt
000.000
111.111
1111111
0000000
222.333

【讨论】:

  • 我觉得这很好.. grep 运行了大约一个小时,然后又空了回来.. 如果有匹配项,它会正确显示吗?
  • 你是 没有覆盖一个案例那个字符串是 sub string in file 2 。例如: file2 包括 000.000.00 。您的解决方案会将其识别为 file1 中的字符串(将字符串打印为相同的字符串)
  • 您是正确的@shaikisiegal - 感谢您指出这一点。我已经编辑了我的答案。
【解决方案2】:
  awk '{if(NR==FNR){a[$0]++} else {if (a[$0])print "in both " $0}}' file1 file2
  1. if(NR==FNR) - 检查是否从第一行读取行,插入要用作字典中的键的值并增加该键的值 a[$0]++ ($0 -key, ++ inc 值)
  2. else if (a[$0]) 检查字典是否包含名为 $0 的键(检查第一个文件中是否存在行)
  3. 如果行存在print "in both " $0(打印“in both”字符串和在两者中找到的值)

【讨论】:

  • 试过了,但速度超快,我想我可能用错了
  • awk 真的很高效。你的文件有多大?
  • 138KB 10k 行在 5.9MB 文件中搜索 400,000 行
  • 我在 2 个文件上测试过:
  • 使用 seq 命令创建了两个文件。从 1 到 10000000 和 20000000 的所有数字:seq 1 1 10000000 > file1 seq 1 1 20000000 > file2 **76M** Feb 14 00:16 file1**162M** Feb 14 00:16 file2对于您的文件的大小,它应该不会花费时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多