Как сделать оператор if внутри цикла while для выполнения определенных действий только над определенными строками? - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь написать простой bash-скрипт, запущенный в sh, который позволяет мне создавать новый выходной файл, начиная с входного файла и удерживая каждую строку, начинающуюся с ">", в то время как для каждой строки, которая не чтобы удовлетворить это требование, он должен удалить каждый третий символ и затем повесить его в новом файле.

входной файл:

>0197_16S  
-AAAAACATGTCCTCTTGTTTATA-----TNTGAGGTTTGACCTGCCCTATG--A---  
>0688_16S    
-----ACATCTTCTCTTGAGTTAT-----TTTGAGATATGACCTGCCCAATG--A-T-  
.  
.  
.  
.  

sh скрипт:

while IFS= read line; do  
if [ "$line" = ">"* ]; then echo "$line" >> output.txt  
else
var=$(echo "$line" | awk -vFS= '{for (i = 1; i <=NF; i+3) {printf $i(i+1)} printf "\n"}');  
echo "$var" >> output.txt  
fi;  
done <foo.txt  

оператор else работает, однако условие if никогда не проверяется, удаляя каждый третий символ также из строк, начинающихся с символа ">".

фактическая мощность:

>09716  
-AAACAGTCTTTTTAT----NTAGTTGACTCCTAG-A--  
>08816
----CACTCTTTAGTA----TTAGTAGACTCCAAG-A--  
.  
.  
.  

ожидаемый результат:

>0197_16S  
-AAACAGTCTTTTTAT----NTAGTTGACTCCTAG-A--  
>0688_16S  
----CACTCTTTAGTA----TTAGTAGACTCCAAG-A--  
.  
.  
.  

1 Ответ

0 голосов
/ 18 мая 2019

Старайтесь избегать цикла while.

Без условия keeping each line starting with ">" in its first position Вы можете сделать

sed -r  's/(..)./\1/g' foo.txt

Добавить условие для строк с > можно, изменив все строки, которые не соответствуют

sed -r  '/^>/ !s/(..)./\1/g' foo.txt

Или с awk:

awk '/^>/ {print;next} {print gensub(/(..)./,"\\1", "g")}' foo.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...