Я пытаюсь переписать некоторые из моих старых сценариев bash, которые, как я думаю, очень неэффективны (не говоря уже о неэлегантном) и используют некоторые ужасные трубы ... Возможно, кто-то с реальными навыками Python может дать мне некоторые указатели ...python file manipulations (bash script porting)
скрипт делает использование нескольких файлов временных ... еще одна вещи, я думаю, что это плохой стиль, и, вероятно, можно избежать ...
это существенно манипулирует INPUT-FILE
на первом вырезание определенного количество строк сверху (отбрасывающий заголовок).
Затем вытаскивает один из столбцов и:
- высчитывает количество
raws = N
; - выбрасывает все повторяющиеся записи из этого единственного файла колонки (я использую
sort -u -n FILE > S-FILE
).
После этого я создаю индекс целых чисел от 1 до N и вставляю этот новый индексный столбец в исходный INPUT-FILE
с помощью команды вставки.
Затем мой скрипт bash генерирует ранги Percentile для значений, которые мы ввели в S-FILE.
Я считаю, что Python использует scipy.stats
, тогда как в bash я определяю количество повторяющихся строк (dupline) для каждой уникальной записи в S-FILE, а затем вычисляется per-rank=$((100*($counter+$dupline/2)/$length))
, где $ length = length FILE, а не S-FILE. Затем я распечатывал результаты в отдельный файл с 1 столбцом (и повторял бы один и тот же за каждый ранг столько раз, сколько у нас есть).
Я бы вставил этот новый столбец с процентильными рядами обратно в INPUT-FILE (так как я хотел бы сортировать INPUT-FILE по столбцу, используемому для вычисления рангов процентиля - все будет идеально соответствовать результату).
После этого он переходит в ниже уродства ...
sort -o $INPUT-FILE $INPUT-FILE
awk 'int($4)>2000' $INPUT-FILE | awk -v seed=$RANDOM 'BEGIN{srand(seed);} {print rand()"\t"$0}' | sort -k1 -k2 -n | cut -f2- | head -n 500 > 2000-$INPUT-FILE
diff $INPUT-FILE 2000-$INPUT-FILE | sed '/^[0-9][0-9]*/d; s/^. //; /^---$/d' | awk 'int($4)>1000' | awk -v seed=$RANDOM 'BEGIN{srand(seed);} {print rand()"\t"$0}' | sort -k1 -k2 -n | cut -f2- | head -n 500 > 1000-$INPUT-FILE
cat 2000-$INPUT-FILE 1000-$INPUT-FILE | sort > merge-$INPUT-FILE
diff merge-$INPUT-FILE $INPUT-FILE | sed '/^[0-9][0-9]*/d; s/^. //; /^---$/d' | awk 'int($4)>500' | awk -v seed=$RANDOM 'BEGIN{srand(seed);} {print rand()"\t"$0}' | sort -k1 -k2 -n | cut -f2- | head -n 500 > 500-$INPUT-FILE
rm merge-$INPUT-FILE
По сути, это очень безвкусный Баш способ сделать следующее:
- СЛУЧАЙНО выбрать 500 линий от $ ВХОД -FILE, где значение в столбце 4 больше 2000 и записывает его в файл 2000- $ INPUT-FILE
- Для всех строк REMAINING в $ INPUT-FILE произвольно выбирайте 500 строк, где значение в столбце 4 больше 1000 и записать его в файл 1000- $ I NPUT-FILE
- для всех остальных строк в $ Ввод файла после 1) и 2), случайным образом выбрать 500 строк, в которых значение в колонке 4 больше, чем 500, и записывает его в файл 500- $ Ввод файла
Опять же, я надеюсь, что кто-то может помочь мне в переработке этой уродливой трубопроводной вещи в красоту питона! :) Благодаря!
Вы можете добавить одну примерную строку из файла и пример того, как вы вызываете этот скрипт из командной строки? –
Пожалуйста, просмотрите предварительный просмотр перед публикацией и убедитесь, что вы избегаете стенок текста. Это будет когда-либо игнорировать ваш вопрос, потому что слишком сложно расшифровать сказанное. – Serdalis
Некоторые библиотеки для просмотра: 'tempfile',' difflib' 'random' – monkut