Lynob Asked: 2015-08-14 10:14:26 +0800 CST2015-08-14 10:14:26 +0800 CST 2015-08-14 10:14:26 +0800 CST 搜索数列 772 假设你有一个包含 500 万行的 file1.csv,每行有 8 个随机数,用逗号分隔。你有这个序列7,152,13,11,42,5,7 如何输出 file1.csv 中的行,其中包含该序列中的 3 个或更多数字以及行号? perl 2 个回答 Voted Best Answer glenn jackman 2015-08-14T10:49:56+08:002015-08-14T10:49:56+08:00 有趣的。我会用awk awk -F, -v seq="7,152,13,11,42,5,7" ' BEGIN { n = split(seq, a) for (i=1; i<=n; i++) num[a[i]]=1 } { n=0 for (i=1; i<=NF; i++) { if ($i in num) n++ if (n == 3) { print break } } } ' bigfile 可以预见,perl 更简洁 export seq="7,152,13,11,42,5,7" perl -F, -lane ' BEGIN {%nums = map {$_ => 1} split /,/, $ENV{seq}} print if scalar(grep {exists $nums{$_}} @F) >= 3 ' file heemayl 2015-08-14T10:54:08+08:002015-08-14T10:54:08+08:00 这是python完成这项工作的脚本: #!/usr/bin/env python2 nums = set('7,152,13,11,42,5,7'.split(',')) with open('/path/to/file.txt') as f: f = enumerate(f, start=1) for i, line in f: if len(set.intersection(nums, set(line.split(',')))) >= 3: print str(i) + ': ' + line.rstrip() ,将包含我们要匹配的set数字nums 我们创建了一个enumerate对象来获取行号并遍历这些行 set.intersection(nums, set(line.split(',')))nums从和中获取共同的数字line 如果该序列中有 3 个或更多数字出现在行if len(....) >= 3中,则将打印行号和行。 输出将是这样的: 1: 7,152,13,11,42,5,45 2: 7,152,1,5,7,34,44 3: 7,152,13,11,42,5,7 5: 11,42,5,7,7,152,13 还要考虑到数字不必按照提到的确切顺序出现,它们可以按任何顺序出现。
有趣的。我会用awk
可以预见,perl 更简洁
这是
python
完成这项工作的脚本:,将包含我们要匹配的
set
数字nums
我们创建了一个
enumerate
对象来获取行号并遍历这些行set.intersection(nums, set(line.split(',')))
nums
从和中获取共同的数字line
如果该序列中有 3 个或更多数字出现在行
if len(....) >= 3
中,则将打印行号和行。输出将是这样的:
还要考虑到数字不必按照提到的确切顺序出现,它们可以按任何顺序出现。