我已經寫在bash一個小程序,轉換多個(標籤)線,具有六列,成一個單一的線,具有如下面12列:爲什麼我的程序需要這麼長時間才能運行?
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12
input
Scaffold952 345718 345781 aug3.g8795.t1 . -
Scaffold952 346504 346534 aug3.g8795.t1 . -
Scaffold952 346721 346733 aug3.g8795.t1 . -
Scaffold952 348148 348241 aug3.g8795.t1 . -
output
Scaffold952 345718 345781 aug3.g8795.t1 . - 345718 345718 0 4 63,30,12,93 0,786,1003,2430
要完成此:
- 需要六個輸入,根據名稱排序(第4欄),然後由起始(COL2)
- 生成從輸入名稱的列表和刪除重複在步驟2中 產生
- 的foreach線210條
- 尋找對應於所述輸入線
- 使用列中的兩個和三個構建列11和12,將值插入陣列
- 結合列和陣列,以形成最終的,12列輸出
- 插入輸入到輸出文件
第11列由$ 3 - $ 2組成;列12由$ 2減去第一個$ 2值(345718)組成,每列爲6行,並打印爲csv。
我的代碼:
#!/bin/bash
input=$1
output=$2
> $output
# functions
function joinArray { local IFS="$1"; shift; echo "$*"; }
# sort input
sort -k4,4 -k2,2 -o $input < $input
awk '{ print $4 }' $input | uniq | while read -r line; do
dup="$(grep -c $line $input)"
start="$(grep $line $input | awk 'NR==1 { print $2 }')"
records="$(grep $line $input | awk 'NR==1 { print $0 }')"
grep $line $input | {
while read -r record; do
blocksize+=($(awk '{ print $3 - $2 }' <<< "$record"))
blockstart+=($(awk -v var="$start" '{ print $2 - var }' <<< "$record"))
done
# combine input with arrays to form 12 col output
bed12[0]+=$(awk '{ print $1 }' <<< "$records")
bed12[1]+=$(awk '{ print $2 }' <<< "$records")
bed12[2]+=$(awk '{ print $3 }' <<< "$records")
bed12[3]+=$(awk '{ print $4 }' <<< "$records")
bed12[4]+=$(awk '{ print $5 }' <<< "$records")
bed12[5]+=$(awk '{ print $6 }' <<< "$records")
bed12[6]+=$(awk '{ print $2 }' <<< "$records")
bed12[7]+=$(awk '{ print $2 }' <<< "$records")
bed12[8]+='0'
bed12[9]+=$dup
bed12[10]+=$(joinArray $',' "${blocksize[@]}")
bed12[11]+=$(joinArray $',' "${blockstart[@]}")
joinArray $'\t' "${bed12[@]}" >> $output
}
done
到目前爲止,我已經無法有效地使此代碼運行,我希望提高它作爲一個標準大小的文件(〜30000行),花了三個小時完成。我不確定是什麼原因造成了每次寫入記錄時打開/關閉輸出文件的問題;嵌套while循環;數組?這是一個糟糕的程序,語言不是一個合適的選擇,或者這是一個大文件(1.7 MB)的預期?
葉gawds。你運行*如何處理每一行的許多外部程序?!你會如何期待**不會變慢?! –
簡短形式:可以在bash中編寫sorta-kinda體面的軟件(使用ksh93更容易),但是您首先遇到了很大的障礙,需要知道自己在做什麼。選擇不同的語言要容易得多。 –
對於每個腳手架來說,糟糕的'$ input'文件至少讀取五次... – Kusalananda