Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 将循环合并到文件处理中_Loops_Awk_Sed - Fatal编程技术网

Loops 将循环合并到文件处理中

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

我有几行代码看起来像这样,尽管它只能处理一个文件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.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