Bash

問題修剪拖尾字元

  • January 12, 2017

我有以下腳本:

#!/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

引用自:https://unix.stackexchange.com/questions/336688