У меня есть file.csv, который выглядит так
4,6,18,23,26
5,12,19,29,31
2,5,13,16,30
9,10,24,27,32
4,5,10,19,22
4,6,8,10,25
2,3,4,25,11
Я хочу найти некоторые шаблоны и сохранить их в другом файле журнала file.log и удалить их из первого файла. Perl или grep идеально
, например, если x + 1 = x2, в диапазоне от 3, удалите строку и запишите ее существование в другом файле и там, где она существует. Таким образом, 2,4,5,25,11 будет удален из file.csv, а в file.log я найду что-то вроде row 7: 2,3,4,25,11 was removed from file.csv. Я пытаюсь найти последовательностиЯ думаю, для этого вам нужен более тяжелый язык программирования. Python - мой язык выбора, поэтому вот простой скрипт с простым примером теста:
import sys
tests = [
lambda a, b, c, d, e: a+1==b and b+1==c and c+1==d and d+1==e,
]
with open(sys.argv[1]) as f:
for line in f:
if any(t(*map(int, line.split(','))) for t in tests):
sys.stderr.write('Line removed: %s\n' % line)
continue
print line
Это, очевидно, только скелетный пример тестов, но он должен использоваться. Запустите нормально, он выведет только строки, которые не соответствуют STDOUT, и те, которые относятся к STDERR. Это делает его полезным для перенаправления в новый файл.
Здесь он находится в действии:
$ python patterns.py <(echo -n 1,2,3,4,5)
Line removed: 1,2,3,4,5
$ python patterns.py <(echo -n 1,2,4,4,5)
1,2,4,4,5
Как только вы загрузили его шаблонами, вы можете просто передать его csv: python patterns.py input.csv
Что касается производительности, Python не всегда самый быстрый. my использует его, потому что он более чем достаточно быстрый для веб-разработки, и время для написания намного быстрее (это то, что стоит мне время / деньги).
Вы можете ускорить процесс с PyPy. Это альтернативная среда исполнения Python, которая отлично изучает. Возможно, вам не нужна версия PPA (Trusty ships 2.2, PPA - 2.3.1), но вот как вы это сделали:
sudo add-apt-repository ppa:pypy/ppa
sudo apt-get update
sudo apt-get install pypy
Затем вы запустили свой скрипт с помощью pypy script.py или если вы его выполнение напрямую изменяет открывание shebang на #!/usr/bin/env pypy. Я провел очень простое тестирование на входном файле с 350000 строк (ваш пример с удивительным успехом ) с вышеупомянутым скриптом.
python2 запустил его в 1.417s и pypy запустил его в 0.645s. По моему опыту, вы, вероятно, увидите еще большее улучшение с более сложными algos.
... Но да, ничто из этого не будет бить эквивалент C / C ++. Если время, затрачиваемое на запуск, это деньги, потратьте некоторое время на повторное выполнение этого на более быстром языке.
perl:
$ perl -i.bak -F, -ane '
if ($F[0]+1 == $F[1] and $F[1]+1 == $F[2]) {warn "row $.: $_"} else {print}
' file.csv 2>file.log
$ cat file.log
row 7: 2,3,4,25,11
$ cat file.csv
4,6,18,23,26
5,12,19,29,31
2,5,13,16,30
9,10,24,27,32
4,5,10,19,22
4,6,8,10,25