Loops 将循环合并到文件处理中
我有几行代码看起来像这样,尽管它只能处理一个文件5cym24.pdb,即: 我的问题是,如何包含一个循环,以便它处理我拥有的许多pdb文件,例如5cymX.pdb,其中X的范围从24到70,从而生成5cymX_d.pdb、5cymX_b.pdb、5cymX_a.pdb、5cymX_d.csv、5cymX_b.csv、5cymX_a.csv。谢谢 试试这个:Loops 将循环合并到文件处理中,loops,awk,sed,Loops,Awk,Sed,我有几行代码看起来像这样,尽管它只能处理一个文件5cym24.pdb,即: 我的问题是,如何包含一个循环,以便它处理我拥有的许多pdb文件,例如5cymX.pdb,其中X的范围从24到70,从而生成5cymX_d.pdb、5cymX_b.pdb、5cymX_a.pdb、5cymX_d.csv、5cymX_b.csv、5cymX_a.csv。谢谢 试试这个: #!/bin/bash do_work() { grep -E 'TRP' "5cym$1.pdb" > "5cym$1_d
#!/bin/bash
do_work() {
grep -E 'TRP' "5cym$1.pdb" > "5cym$1_d.pdb"
grep -E 'CYS' "5cym$1.pdb" > "5cym$1_b.pdb"
sed -n '3030,3106p;3138,3205p;3238,3268p;3329,3361p;3423,3453p' "5cym$1.pdb" > "5cym$1_a.pdb"
awk '{$1=$1}1' OFS=, "5cym$1_d.pdb" > "5cym$1_d.csv"
awk '{$1=$1}1' OFS=, "5cym$1_b.pdb" > "5cym$1_b.csv"
awk '{$1=$1}1' OFS=, "5cym$1_a.pdb" > "5cym$1_a.csv"
}
for i in $(seq 24 70); do
do_work "$i"
done
您现有的代码:
grep -E 'TRP' 5cym24.pdb > 5cym24_d.pdb
grep -E 'CYS' 5cym24.pdb > 5cym24_b.pdb
sed -n '3030,3106p;3138,3205p;3238,3268p;3329,3361p;3423,3453p' 5cym24.pdb > 5cym24_a.pdb
awk '{$1=$1}1' OFS=, 5cym24_d.pdb > 5cym24_d.csv
awk '{$1=$1}1' OFS=, 5cym24_b.pdb > 5cym24_b.csv
awk '{$1=$1}1' OFS=, 5cym24_a.pdb > 5cym24_a.csv
当然,由于您没有提供用于测试的样本输入/输出,因此可以减少到仅1次对awk的调用未经测试:
awk -v OFS=',' '
FNR==1 {
close(base"_a.csv")
close(base"_b.csv")
close(base"_d.csv")
base = FILENAME
sub(/\.pdb$/,"",base)
}
{ $1=$1 }
/TRP/ { print > (base"_d.csv") }
/CYS/ { print > (base"_b.csv") }
(FNR>=3030 && FNR<=3106) || (FNR>=3138 && FNR<=3205) || (FNR>=3238 && FNR<=3268) ||
(FNR>=3329 && FNR<=3361) || (FNR>=3423 && FNR<=3453) { print > (base"_a.csv") }
' 5cym24.pdb
您可能只需将5cym24.pdb更改为*.pdb或任何您想要提供的输入文件列表,就可以一次按原样处理所有文件。不清楚,请在您的帖子中添加更多信息,然后让我们知道。您没有。你正在做的每件事和你想做的每件事几乎都可以通过打一个awk电话来完成。您的问题将显示一个简洁、可测试的示例输入和预期输出,以获得帮助。
awk -v OFS=',' '
FNR==1 {
close(base"_a.csv")
close(base"_b.csv")
close(base"_d.csv")
base = FILENAME
sub(/\.pdb$/,"",base)
}
{ $1=$1 }
/TRP/ { print > (base"_d.csv") }
/CYS/ { print > (base"_b.csv") }
(FNR>=3030 && FNR<=3106) || (FNR>=3138 && FNR<=3205) || (FNR>=3238 && FNR<=3268) ||
(FNR>=3329 && FNR<=3361) || (FNR>=3423 && FNR<=3453) { print > (base"_a.csv") }
' 5cym24.pdb