bash - 如何在 while 循环中创建 if 语句以仅在某些行上执行某些操作?
问题描述
我正在尝试编写一个在 sh 中启动的简单 bash 脚本,它允许我从输入文件开始创建一个新的输出文件,并保持以 ">" 开头的每一行在其位置,而对于不满足此要求的每一行,它必须删除每三个字符,然后将其挂在新文件中。
输入文件:
>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--
.
.
.
解决方案
尝试避免 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
推荐阅读
- python - 只更新一个子图而不是整个图(使用 matplotlib)
- php - 我在哪里可以在 Nova 应用程序中添加 Google Analytics 跟踪代码,以便在每次路线更改时触发它
- javascript - javascript this.nombre 未定义
- java - 在文本文件中搜索单词
- javascript - 如何在 redux reducer 中删除购物车项目?
- android - script.sh:第 1 行:./gradlew:Jenkins 上没有这样的文件或目录
- sqlite - Xamarin 表单 sql lite 表添加外键约束
- css - 如何使反应组件内的 div 的背景透明?
- java - 使用 JSF 将 Arraylist 拆分为多列
- javascript - JavaScript 的 .setSelectionRange() 与 React Hooks 不兼容吗?