假设您有一个包含 500 万行的 file1.csv,每行有 8 个以逗号分隔的随机数。并且您有以下序列7,152,13,11,42,5,7
如何输出 file1.csv 中包含该序列中的 3 个或更多数字以及行号的行?
答案1
有趣。我会使用 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
答案2
下面是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
另外考虑到数字不必按照提到的严格顺序出现,它们可以按照任何顺序出现。