скажите, что у Вас есть file1.csv, содержащий 5 миллионов строк, каждая строка имеет 8 случайных чисел, разделенных запятой. И у Вас есть эта последовательность 7,152,13,11,42,5,7
Как произвести строки в file1.csv, содержащем 3 или больше числа от той последовательности наряду с номером строки?
Интересный. Я использовал бы 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
Очевидно, жемчуг является намного более кратким
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
Вот 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
Также рассмотрение чисел не должно существовать точного упомянутого порядка, они могут существовать любого порядка.