bash - 如何在循环中运行 bash 脚本
问题描述
我编写了一个 bash 脚本,以便从两个输入文件中提取子字符串并将其保存到一个输出文件中,如下所示:输入文件 1
>genotype1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
输入文件 2
gene1 10 20
gene2 40 50
genen x y
我的剧本
>output_file
cat input_file2 | while read row; do
echo $row > temp
geneName=`awk '{print $1}' temp`
startPos=`awk '{print $2}' temp`
endPos=`awk '{print $3}' temp`
length=$(expr $endPos - $startPos)
for i in temp; do
echo ">${geneName}" >> genes_fasta
awk -v S=$startPos -v L=$length '{print substr($0,S,L)}' input_file1 >> output file
done
done
我怎样才能使它在输入文件1中的多个字符串的循环中工作?新的输入文件如下所示:
>genotype1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>genotype2
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
>genotypen...
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn...
我希望每个基因型都有一个不同的输出文件,并且文件名将是基因型名称。谢谢你!
解决方案
如果我理解正确,您会尝试以下操作:
awk '
FNR==NR {
name[NR] = $1
start[NR] = $2
len[NR] = $3 - $2
count = NR
next
}
/^>/ {
sub(/^>/,"")
genotype=$0
next
}
{
for (i = 1; i <= count; i++) {
print ">" name[i] > genotype
print substr($0, start[i], len[i]) >> genotype
}
close(genotype)
}' input_file2 input_file1
输入文件1:
>genotype1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>genotype2
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
>genotype3
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
输入文件2:
gene1 10 20
gene2 40 50
gene3 20 25
【结果】
基因型1:
>gene1
aaaaaaaaaa
>gene2
aaaaaaaaaa
>gene3
aaaaa
基因型2:
>gene1
bbbbbbbbbb
>gene2
bbbbbbbbbb
>gene3
bbbbb
基因型3:
>gene1
nnnnnnnnnn
>gene2
nnnnnnnnnn
>gene3
nnnnn
[编辑]
如果要将输出文件存储到不同的目录,请尝试以下操作:
dir="./outdir" # directory name to store the output files
# you can modify the name as you want
mkdir -p "$dir"
awk -v dir="$dir" '
FNR==NR {
name[NR] = $1
start[NR] = $2
len[NR] = $3 - $2
count = NR
next
}
/^>/ {
sub(/^>/,"")
genotype=$0
next
}
{
for (i = 1; i <= count; i++) {
print ">" name[i] > dir"/"genotype
print substr($0, start[i], len[i]) >> dir"/"genotype
}
close(dir"/"genotype)
}' input_file2 input_file1
- 第一两行在 bash 中执行以定义和 mkdir 目标目录。
- 然后目录名
awk
通过-v
选项传递给
希望这可以帮助。
推荐阅读
- r - 如何仅在日期轴上必要时显示年份
- javascript - 将纹理应用到四边形的一半
- java - 无法修复不匹配类型:无效为布尔值
- visual-studio-code - 从 Dotnet Angular 项目中删除组件时出错
- r - 根据日期按组比较值并创建新的数据框,其中两列中的值下降
- java - JSON 错误:无法构造类名的实例?
- php - 使用包含来自另一个表的值的数组属性查询实体
- php - 如何使用 php 基于正则表达式批量重命名图像?
- laravel - Laravel - 如何在 Maatwebsite Excel 导入中应用 SkipOn 失败
- phabricator - 语料库和呼号在 Phabricatior 中是什么意思?