搜索数字序列

搜索数字序列

假设您有一个包含 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

另外考虑到数字不必按照提到的严格顺序出现,它们可以按照任何顺序出现。

相关内容