Hat_if_nat
|
молчу,смотрю в даль
|
|
|
|
Рег.: 23.01.2005
|
Сообщений: 448
|
Из: сказка Туве Янссон
|
Рейтинг: 160
|
|
[nix] Быстро обработать текстовый файл. Подскажите, по SED скрипту
17.05.2010 11:38
|
|
|
Написал код на баше который перед каждой строкой куска геномного кода ставит порядковый номер, например :
>SEQUENCE_1_length_35 G.CCCTGATCAGCCGGATGGGCAACCAGAAGGTCCG >SEQUENCE_2_length_35 G.TCCACACCGGCATCCCCGAGCCGCGACATGCCGG
code: #!/usr/bin/bash
len=$(wc -l s7.fa | awk '{print($1)}' )
(( len++ ))
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
Проблема, в том что количество строк для обработки огромное (~десятки миллионов) , и за трое суток скрипт не успел обработать и 20 % инфы. Вопрос знатокам: может быть есть более быстрый способ ? Например sed...
Редактировал DarkGray (19.05.2010 13:30)
|
|
|
Basilio
|
GreenOne
|
|
|
|
Рег.: 14.10.2002
|
Сообщений: 13749
|
Из: Москва
|
Рейтинг: 3476
|
|
|
я конечно понимаю, что сед полон по Тьюрингу, но может быть программа на более высокоуровневом языке справится быстрее?
|
|
horror
|
гонобобель
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 3783
|
|
Рейтинг: 2135
|
|
|
Quote:
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
вижу квадрат ![](/smiles/GLOL.gif) данную задачу надо решать линейным пробегом
|
|
horror
|
гонобобель
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 3783
|
|
Рейтинг: 2135
|
|
|
обычно на линуксах tcl есть (в баше я не спец )
code:
#!/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
|
|
Lynn
|
'Кофеман'
|
|
|
|
Рег.: 28.02.2003
|
Сообщений: 7315
|
Из: Тропарево-Никулино
|
Рейтинг: 905
|
|
|
code: perl -pe 'print ">SEQUENCE_", ++$i, "_length_35\n"' < s7.fa
|
Плыл в небе, глубоком как сон, Кокаиновый пес - Адриан и Александр |
|
Vovkaii
|
Carpal Tunnel
|
|
|
|
Рег.: 08.11.2003
|
Сообщений: 3919
|
Из: Espoo
|
Рейтинг: 3268
|
|
|
code: % 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
|
Сделай это сам ![](/smiles/ani_smiles.gif) |
|
Hat_if_nat
|
молчу,смотрю в даль
|
|
|
|
Рег.: 23.01.2005
|
Сообщений: 448
|
Из: сказка Туве Янссон
|
Рейтинг: 160
|
|
|
|
Jerry
|
Санек
|
|
|
|
Рег.: 14.03.2004
|
Сообщений: 1360
|
Из: Москва
|
Рейтинг: 501
|
|
|
Ну и на sed'е, раз уж просили ![:grin:](/images/graemlins/grin.gif)
code:
sed -e "=" | sed -e "s/^/>SEQUENCE_/;s/$/_length_35/;N"
|
|
Jerry
|
Санек
|
|
|
|
Рег.: 14.03.2004
|
Сообщений: 1360
|
Из: Москва
|
Рейтинг: 501
|
|
|
Решил еще сравнить по скорости предложенные решения Тестировались на одном файле в 1млн строк. Результаты сравнивались, у всех получалось одно и то же ![:)](/images/graemlins/smile.gif)
script | real | user | sys |
horror_script.tcl | 12.486s | 6.252s | 4.213s |
Lynn_perl | 5.047s | 2.043s | 0.194s |
Vovkaii_bash | 1m57.362s | 1m28.694s | 16.965s |
Jerry_sed | 6.012s | 4.159s | 0.294s |
Vital303_awk | 4.887s | 1.793s | 0.194s |
horror_haskell_wine | 1m25.286s | 34.061s | 14.562s |
Самые быстрые пока perl и awk. В решении Vovkaii похоже где-то вылазит квадратичное время работы, или просто константа большая при n
Редактировал Jerry (17.05.2010 18:04)
|
|
Vital303
|
tired
|
|
|
|
Рег.: 18.10.2004
|
Сообщений: 480
|
|
Рейтинг: 44
|
|
|
awk code: awk '{print "SEQUENCE_" NR "_length_35"} 1'
|
|
horror
|
гонобобель
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 3783
|
|
Рейтинг: 2135
|
|
|
а давай еще в эту статистику вот это чудо вставим?:)
code:
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
|
|
Jerry
|
Санек
|
|
|
|
Рег.: 14.03.2004
|
Сообщений: 1360
|
Из: Москва
|
Рейтинг: 501
|
|
|
Не, не получится, я либо не знаю, что это за язык, либо у меня к нему интерпретатора нет на компе. А скорее всего ни то, ни другое ![:grin:](/images/graemlins/grin.gif)
|
|
Sevurrrra
|
Хранитель маяка
|
|
|
|
Рег.: 10.09.2007
|
Сообщений: 2050
|
|
Рейтинг: 2759
|
|
|
|
reincarnation
|
knight
|
|
|
|
Рег.: 12.09.2006
|
Сообщений: 719
|
|
Рейтинг: 666
|
|
|
Quote:
пейтон это
Это не пейтон, это Haskell.
|
|
horror
|
гонобобель
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 3783
|
|
Рейтинг: 2135
|
|
|
Quote:
Не, не получится
если ты на винде, то я тебе могу скомпилированный ехешник дать, должен запуститься без доп. либ зы: возможно, это уже нечестно сравнивать со скомпилированным скриптом =\
|
|
reincarnation
|
knight
|
|
|
|
Рег.: 12.09.2006
|
Сообщений: 719
|
|
Рейтинг: 666
|
|
|
Quote:
зы: возможно, это уже нечестно сравнивать со скомпилированным скриптом =\
Это да, чтобы по-честному, надо через runghc запускать.
|
|
horror
|
гонобобель
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 3783
|
|
Рейтинг: 2135
|
|
|
Quote:
Это да, чтобы по-честному, надо через runghc запускать.
вот спасибо, а я не знал=\ ковырял командную строчку у ghc, ghci и ничего не нашел =\
|
|
Jerry
|
Санек
|
|
|
|
Рег.: 14.03.2004
|
Сообщений: 1360
|
Из: Москва
|
Рейтинг: 501
|
|
|
Quote:
зы: возможно, это уже нечестно сравнивать со скомпилированным скриптом =\
С моей стороны тоже будет нечестно запускать его через wine Добавил строчку в табличку
|
|
horror
|
гонобобель
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 3783
|
|
Рейтинг: 2135
|
|
|
что-то барахлит твой скрипт можешь подфиксить?
Редактировал horror (17.05.2010 23:06)
|
|
horror
|
гонобобель
|
|
|
|
Рег.: 30.09.2002
|
Сообщений: 3783
|
|
Рейтинг: 2135
|
|
|
Аналогичная статистика (cygwin на помощь пришел)
script | real | user | sys
|
Lynn_perl | 0m2.884s | 0m2.609s | 0m0.202s
|
Vital303_awk | 0m3.385s | 0m3.328s | 0m0.031s
|
Vovkaii_bash | 2m34.265s | 1m24.561s | 1m18.983s
|
horror_script.tcl | 0m29.753s | 0m0.000s | 0m0.046s
|
horror_hs | 0m5.834s | 0m0.000s | 0m0.016s
|
horror_hs_exe | 0m3.567s | 0m0.000s | 0m0.000s
|
horror_bat | 34.23m
|
horror_vbs | 0m43.249s | 0m0.015s | 0m0.000s
|
horror_lua | 0:02.89
|
hat_if_nat (37%) | 631m24.843s | 122m34.159s | 248m2.638s
|
Sevurrrra_ocaml | 0:12.07 |
Редактировал horror (18.05.2010 10:15)
|
|