[nix] Быстро обработать текстовый файл. Подскажите, по SED скрипту
программа на более высокоуровневом языке справится быстрее?
for i=1; i<$len; i+=1вижу квадрат
do
echo '>SEQUENCE_'${i}'_length_35' >> s7_fasted.fa
head -n $i forSOAP_s7_final.fa | tail -n 1 >> s7_fasted.fa
done
данную задачу надо решать линейным пробегом
#!/usr/bin/tclsh
proc Numerate {fileName} {
set h [open $fileName r]
set lineNumber 0
while {[gets $h line] >= 0} {
incr lineNumber
puts ">SEQUENCE_${lineNumber}_length_35"
puts $line
}
close $h
}
if {$argc >= 1} {
Numerate [lindex $argv 0]
} else {
puts "Usage: tclsh script.tcl filename"
}
если сделать скрипту chmod +x, то по идее запустится просто: ./script.tcl myfile.txt
в вашем случае запуск такой:
./script.tcl forSOAP_s7_final.fa > s7_fasted.fa
perl -pe 'print ">SEQUENCE_", ++$i, "_length_35\n"' < s7.fa
% i=1; cat forSOAP_s7_final.fa | while read line; do echo '>SEQUENCE_'${i}'_length_35'; echo $line; i=$i+1; done > s7_fasted.fa
Всем большое спасибо!
sed -e "=" | sed -e "s/^/>SEQUENCE_/;s/$/_length_35/;N"
Тестировались на одном файле в 1млн строк. Результаты сравнивались, у всех получалось одно и то же
script | real | user | sys |
_script.tcl | 12.486s | 6.252s | 4.213s |
_perl | 5.047s | 2.043s | 0.194s |
_bash | 1m57.362s | 1m28.694s | 16.965s |
_sed | 6.012s | 4.159s | 0.294s |
_awk | 4.887s | 1.793s | 0.194s |
_haskell_wine | 1m25.286s | 34.061s | 14.562s |
Самые быстрые пока perl и awk. В решении похоже где-то вылазит квадратичное время работы, или просто константа большая при n
awk '{print "SEQUENCE_" NR "_length_35"} 1'
import System (getArgs)
parseFile :: String -> IO
parseFile filename = do
content <- readFile filename
mapM_ putStrLn $ map (\(x, y) -> concat [">SEQUENCE_", show x, "_length_35\n", y]) $ zip [1..] (lines content)
main = do
args <- getArgs
case args of
[] -> error "Usage: program filename"
(filename:xs) -> parseFile filename
Не, не получится, я либо не знаю, что это за язык, либо у меня к нему интерпретатора нет на компе. А скорее всего ни то, ни другое
пейтон это
пейтон этоЭто не пейтон, это Haskell.
Не, не получитсяесли ты на винде, то я тебе могу дать, должен запуститься без доп. либ
зы: возможно, это уже нечестно сравнивать со скомпилированным скриптом =\
зы: возможно, это уже нечестно сравнивать со скомпилированным скриптом =\Это да, чтобы по-честному, надо через runghc запускать.
Это да, чтобы по-честному, надо через runghc запускать.вот спасибо, а я не знал=\
ковырял командную строчку у ghc, ghci и ничего не нашел =\
зы: возможно, это уже нечестно сравнивать со скомпилированным скриптом =\С моей стороны тоже будет нечестно запускать его через wine
Добавил строчку в табличку
можешь подфиксить?
script | real | user | sys |
_perl | 0m2.884s | 0m2.609s | 0m0.202s |
_awk | 0m3.385s | 0m3.328s | 0m0.031s |
_bash | 2m34.265s | 1m24.561s | 1m18.983s |
_script.tcl | 0m29.753s | 0m0.000s | 0m0.046s |
_hs | 0m5.834s | 0m0.000s | 0m0.016s |
_hs_exe | 0m3.567s | 0m0.000s | 0m0.000s |
_bat | 34.23m | ||
_vbs | 0m43.249s | 0m0.015s | 0m0.000s |
_lua | 0:02.89 | ||
hat_if_nat (37%) | 631m24.843s | 122m34.159s | 248m2.638s |
_ocaml | 0:12.07 |
Решил ещё сравнить по скорости предложенные решенияэээ
а можно изначальный скрипт тож в таблицу сравнения добавить?
ну и результаты тоже сравнить
а можно изначальный скрипт тож в таблицу сравнения добавить?ты издеваешься, да ?
ну и результаты тоже сравнить
и за трое суток скрипт не успел обработать и 20 % инфы
и за трое суток скрипт не успел обработать и 20 % инфыдык на его данных
я вот не уверен что у такие же данные
awk '{print ">SEQUENCE_" ++cnt "_length_35\n" $0}' forSOAP_s7_final.fa > s7_fasted.fa
есть же NR
Бля, палюсь.
let rec process ch i =
let s = input_line ch in
print_endline (String.concat "" (">SEQUENCE_" :: string_of_int i :: "_length_35" :: [];
print_endline s;
process ch (i+1);
;;
try
process stdin 1;
with End_of_file -> ;;
awk '{print ">SEQUENCE_" NR "_length_35\n" $0}' forSOAP_s7_final.fa > s7_fasted.fa
awk '{print ">SEQUENCE_" NR "_length_" length($0) "\n" $0}' forSOAP_s7_final.fa > s7_fasted.fa
баяните, мистер
Однако меня несколько смущает имя входного файла. Наше мыло настолько сурово, что его уже делают из нуклеиновых кислот?
selffix после того, как все видели.
А чтоб искупить свою вину кровью, сейчас на брейнфаке напишу.
open ExtLib;;
Enum.iteri (fun i s -> Printf.printf ">SEQUENCE_%d_length_35\n%s\n" (i+1) s) (Std.input_lines stdin);;
А чтоб искупить свою вину кровью, сейчас на брейнфаке напишучьей кровью?!
В решении похоже где-то вылазит квадратичное время работы, или просто константа большая при nИнтересно, где косяк-то. Нередко приходится read'ом пользоваться.
Оставить комментарий
Xomiak09
Написал код на баше который перед каждой строкой куска геномного кода ставит порядковый номер, например :>SEQUENCE_1_length_35
G.CCCTGATCAGCCGGATGGGCAACCAGAAGGTCCG
>SEQUENCE_2_length_35
G.TCCACACCGGCATCCCCGAGCCGCGACATGCCGG
Проблема, в том что количество строк для обработки огромное (~десятки миллионов)
, и за трое суток скрипт не успел обработать и 20 % инфы. Вопрос знатокам: может быть есть более быстрый способ ? Например sed...