首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结合回路与awk

结合回路与awk
EN

Stack Overflow用户
提问于 2022-09-05 11:43:42
回答 3查看 61关注 0票数 1

我需要人帮我把一个awk和一个循环结合起来。

我有两个文件,一个是Bedfile.bed,另一个是Samplelist.txt,如下所示:

Bedfile.bed

代码语言:javascript
复制
HiC_scaffold_2  1       50001

HiC_scaffold_2  400001  450001

HiC_scaffold_2  800001  850001

Samplelist.txt

代码语言:javascript
复制
sampleA
sampleB
sampleC

我希望为每个示例创建一个新的Bedfile (来自Samplelist.txt),其中我将示例名称作为新列包含在每一行旁边,并将该名称添加到输出中。如下所示,例如,对于前两个样本

Bedfile_SampleA.bed

代码语言:javascript
复制
HiC_scaffold_2  1       50001 SampleA

HiC_scaffold_2  400001  450001 SampleA

HiC_scaffold_2  800001  850001 SampleA

Bedfile_SampleB.bed

代码语言:javascript
复制
HiC_scaffold_2  1       50001 SampleB

HiC_scaffold_2  400001  450001 SampleB

HiC_scaffold_2  800001  850001 SampleB

我已经完成了一个文件,但我有超过100个文件,所以我想使用一个示例列表执行某种循环。

代码语言:javascript
复制
awk ' {print $1"\t"$2"\t"$3"\t""SampleA"}' Bedfile.bed >  Bedfile_SampleA.bed

有什么建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-09-05 11:59:47

您可以在AWK中全部执行操作和循环,但如果出于另一个原因需要“单独”执行循环,则可以使用:

代码语言:javascript
复制
while read -r sample
do
     awk -v var="$sample" 'BEGIN{OFS="\t"} {print $0, var}' bedfile.bed > bedfile_"$sample".bed
done < samplelist.txt
票数 0
EN

Stack Overflow用户

发布于 2022-09-05 13:37:00

代码语言:javascript
复制
$ awk -v OFS='\t' '
    NR==FNR { samples[$0]; next }
    FNR == 1 {
        base = FILENAME
        sub(/\..*/,"",base)
    }
    {
        for ( sample in samples ) {
            out = base "_" sample ".bed"
            print $0 (NF ? OFS sample : "") > out
        }
    }
' Samplelist.txt Bedfile.bed
代码语言:javascript
复制
$ head Bedfile_*
==> Bedfile_sampleA.bed <==
HiC_scaffold_2  1       50001   sampleA

HiC_scaffold_2  400001  450001  sampleA

HiC_scaffold_2  800001  850001  sampleA

==> Bedfile_sampleB.bed <==
HiC_scaffold_2  1       50001   sampleB

HiC_scaffold_2  400001  450001  sampleB

HiC_scaffold_2  800001  850001  sampleB

==> Bedfile_sampleC.bed <==
HiC_scaffold_2  1       50001   sampleC

HiC_scaffold_2  400001  450001  sampleC

HiC_scaffold_2  800001  850001  sampleC

以上内容将适用于任何awk,假设您没有太多的输出文件来超过“打开的文件太多”的限制。如果您这样做了,它仍然将与GNU awk一起工作,并且有一个简单的调整可以使它与任何awk一起工作。

票数 3
EN

Stack Overflow用户

发布于 2022-09-05 11:52:56

因此,在awk中是非常简单的。首先在内存中读取示例文件,然后处理完整的床文件。

代码语言:javascript
复制
awk 'BEGIN{OFS="\t"}(FNR==NR){a[$0]; next}{for(i in a){f=FILENAME"."i; print $0,i > f}}' sample.txt bed.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73608854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档