Bash
問題修剪拖尾字元
我有以下腳本:
#!/bin/bash SINGLE=`cut -c 7-21 Data.txt` cd ../FASTA_SEC/ for i in ${SINGLE}; do if [ -r ../FASTA_SEC/${i}.fa ]; then HEAD=`sed -n 2p ../FASTA_SEC/${i}.fa | head -c 3` TAIL=`tail -c 4 ../FASTA_SEC/${i}.fa` if [ "${HEAD}" = "AAA" ] then echo "Cut heading A's" $i elif [ "${TAIL}" = "AAA" ] then echo "Cut tailing A's" $i while [ `tail -c 2 ../FASTA_SEC/$i.fa` == "A" ] do TRITAIL=`cat ../FASTA_SEC/$i.fa` echo ${TRITAIL/A/} > ../FASTA_SEC/$i.fa done fi else echo "does not exist" $i fi done
它似乎適用於所有已處理的文本文件,包括 while 循環。但是有幾個文本文件中所有的 A 都被刪除了,並且引入了一些空格,而不是只刪除尾部的 A。
我很驚訝,因為它確實有效,但在某些情況下它會產生混亂。讓我給你看一個例子:
包含 A 拖尾的輸入文件:
>B4-0K032_18670_015 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNGNNNTAGATACAAGCGAGCGGC GGACGGGTGAGTAACACGTGGGTAACCTGCCCAAGAGACTGGGATAACACCTGGAAACAG [Cuted here for shortness] GGNTGTCNTCNGCTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAAAAAAA
輸出混亂的文件:
>G4-0K047_18670_010 NNNNNNNNNNCCNCCTGTNNNTTTGCCCCCGGGGGCCTGTCTCTCGGTGTC GTGTCGCCTGGTGGTTCTTCGCGTTGCTTCGTTCCCTGCTCCC [Cuted here for shortness] CGTCCGCCNTCGTTCCTGNTGTCTCGGTGCNNGCCCGTNTNNNNNNNNNN NNNNNNNNNNNNN
我只想剪掉拖尾A,但在某些文本文件中會出現混亂,但在大多數文件中它執行順利。在一些應該修剪尾隨A的文件中,我得到了這個混亂(甚至其他字元也可能被刪除……)。
我想知道它在某些情況下確實有效,但在某些情況下卻沒有.. 有沒有辦法修剪拖尾 A?
整個腳本最終取決於這兩行來刪除尾隨的“A”:
tritail=$(cat ../FASTA_SEC/$i.fa) echo ${tritail/A/} > ../FASTA_SEC/"$i".fa
由於您已經將整個文件內容放在變數中,因此不需要循環來刪除所有尾隨的 A。你可以這樣做:
tritail="$(cat ../FASTA_SEC/"$i".fa)" shopt -s extglob echo ${tritail#+(A)} > ../FASTA_SEC/"$i".fa
或者,如果您不喜歡更改 extglob 設置:
tritail="$(cat ../FASTA_SEC/"$i".fa)" echo "${tritail%"${tritail##*[!A]}"}" > ../FASTA_SEC/"$i".fa
事實上,這兩個命令就是刪除尾隨 A 所需的全部內容。
第二行通過選擇所有尾隨的 A 來工作。或者,正如命令實際所做的那樣,通過刪除所有不是A (
$$ !A $$) 在變數的前導部分:
tail=${tritail##*[!A]} # Select all the trailing A's
然後,從變數的尾部刪除生成的字元串:
result=${tritail%"$tail"} # Remove the trailing A's
兩個參數擴展都連接到一個命令中:
result=${tritail%"${tritail##*[!A]}"}
這就是發送到(修改後的)文件的內容:
echo "${tritail%"${tritail##*[!A]}"}" > ../FASTA_SEC/"$i".fa
要刪除前導 A,請切換所有選擇:
echo "${tritail#"${tritail%%[!A]*}"}" > ../FASTA_SEC/"$i".fa