我有一個包含多個 fasta 檔案的目錄,命名如下:
BC-1_bin_1_genes.faa
BC-1_bin_2_genes.faa
BC-1_bin_3_genes.faa
BC-1_bin_4_genes.faa
等(大約 200 個單獨的檔案)
fasta 標頭如下所示:
>BC-1_k127_3926653_6 # 4457 # 5341 # -1 # ID=2_6;partial=01;start_type=Edge;rbs_motif=None;rbs_spacer=None;gc_cont=0.697
我現在想將檔案名添加到標題中,因為我想為每個檔案注釋序列。我嘗試了以下操作:
for file in *.faa;
do
sed -i "s/>.*/${file%%.*}/" "$file" ;
done
它部分作業,但它從標題中洗掉了“>”,這對于 fasta 檔案至關重要。我試圖修改 "${file%%.*}" 部分以保留胡蘿卜,但它總是讓我因為糟糕的替換而被淘汰。
我也試過這個:
awk '/>/{sub(">","&"FILENAME"_");sub(/\.faa/,x)}1' *.faa
這在理論上可行,但只在我的終端上列印了所有內容,而不是在相應的檔案中更改它。
有人可以幫忙嗎?
uj5u.com熱心網友回復:
目前尚不清楚您是要替換較早的標題還是添加到它。這兩種情況都很容易做到。不要替換您不想替換的文本。
for file in ./*.faa;
do
sed -i "s/^>.*/>${file%%.*}/" "$file"
done
將替換標題,但在替換中包含前導>,有效地保留它;和
for file in ./*.faa;
do
sed -i "s/^>.*/&${file%%.*}/" "$file"
done
將在標題末尾附加檔案名(&在替換字串中計算為我們正在替換的字串,再次有效地保留它)。
對于另一種變體,請嘗試
for file in *.faa;
do
sed -i "/^>/s/\$/ ${file%%.*}/" "$file"
done
它說在與 regex 匹配的行上,用檔案名^>替換行尾的空字串。$
當然,您的 Awk 腳本也可以輕松修復。標準 awk 沒有與 的-i“就地”選項并行的選項sed,但您可以輕松使用臨時檔案:
for file in ./*.faa;
do
awk '/>/{ $0 = $0 " " FILENAME);sub(/\.faa/,"")}1' "$file" >"$file.tmp" &&
mv "$file.tmp" "$file"
done
GNU Awk 也有一個-i inplace擴展,如果您有 GNU Awk,您可以簡單地將其添加到現有腳本的選項中。
由于 FASTA 檔案通常包含多個標頭,因此添加到標頭而不是用相同的字串替換檔案中的所有標頭似乎更有用,因此我更改了您的 Awk 腳本來代替。
值得一提的是,角色的名字^是插入符號(胡蘿卜是??)。該字符>被稱為大于或右尖括號,或右中斷或有時只是楔形。
uj5u.com熱心網友回復:
您只需要檢測要替換的模式并使用正則運算式來實作它:
fasta_helper.sh
location=$1
for file in $location/*.faa
do
full_filename=${file##*/}
filename="${full_filename%.*}"
#scape special chars
filename=$(echo $filename | sed 's_/_\\/_g')
echo "adding file name: $filename to: $full_filename"
sed -i -E "s/^[^#] />$filename /" $location/$full_filename
done
用法:
只需傳遞帶有 fasta 檔案的檔案夾:
bash fasta_helper.sh /foo/bar
測驗:

講座
- 正則運算式:匹配字符的第一次出現
- 在 Bash 中提取檔案名和擴展名
- https://unix.stackexchange.com/questions/78625/using-sed-to-find-and-replace-complex-string-preferrably-with-regex
uj5u.com熱心網友回復:
定位您的檔案
建議先用find命令或ls命令識別你的檔案。
find . -type f -name "*.faa" -printf "%f\n"
find僅列印帶有檔案擴展名的檔案的命令.faa。包括當前目錄的子目錄。
ls -1 "*.faa"
ls列印帶有擴展名的檔案和目錄的命令.faa。在當前目錄中。
處理您的檔案
獲得正確的檔案串列后,遍歷串列并應用sed命令。
for fileName in $(find . -type f -name "*.faa" -printf "%f\n"); do
stripedFileName=${fileName/.*/} # strip extension .faa
sed -i "1s|\$| $stripedFileName|" "fileName" # append value of stripedFileName at end of line 1
done
uj5u.com熱心網友回復:
這是一個應該產生預期輸出的解決方案:
for filepath in ./*.faa
do
filename=${filepath##*/}
sed -i "s/^>[^_]*/>${filename%_*}/" "$file"
done
背景關系示例:
filepath=./BC-1_bin_1_genes.faa
filename=${filepath##*/}
echo '>BC-1_k127_3926653_6 # 4457 # 5341 # -1 # ID=2_6;etc...' |
sed "s/^>[^_]*/>${filename%_*}/"
>BC-1_bin_1_k127_3926653_6 # 4457 # 5341 # -1 # ID=2_6;etc...
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/448364.html
下一篇:升級Swift依賴項的加密演算法
