我需要人帮我把一个awk和一个循环结合起来。
我有两个文件,一个是Bedfile.bed,另一个是Samplelist.txt,如下所示:
Bedfile.bed
HiC_scaffold_2 1 50001
HiC_scaffold_2 400001 450001
HiC_scaffold_2 800001 850001Samplelist.txt
sampleA
sampleB
sampleC我希望为每个示例创建一个新的Bedfile (来自Samplelist.txt),其中我将示例名称作为新列包含在每一行旁边,并将该名称添加到输出中。如下所示,例如,对于前两个样本
Bedfile_SampleA.bed
HiC_scaffold_2 1 50001 SampleA
HiC_scaffold_2 400001 450001 SampleA
HiC_scaffold_2 800001 850001 SampleABedfile_SampleB.bed
HiC_scaffold_2 1 50001 SampleB
HiC_scaffold_2 400001 450001 SampleB
HiC_scaffold_2 800001 850001 SampleB我已经完成了一个文件,但我有超过100个文件,所以我想使用一个示例列表执行某种循环。
awk ' {print $1"\t"$2"\t"$3"\t""SampleA"}' Bedfile.bed > Bedfile_SampleA.bed有什么建议吗?
发布于 2022-09-05 11:59:47
您可以在AWK中全部执行操作和循环,但如果出于另一个原因需要“单独”执行循环,则可以使用:
while read -r sample
do
awk -v var="$sample" 'BEGIN{OFS="\t"} {print $0, var}' bedfile.bed > bedfile_"$sample".bed
done < samplelist.txt发布于 2022-09-05 13:37:00
$ 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$ 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一起工作。
发布于 2022-09-05 11:52:56
因此,在awk中是非常简单的。首先在内存中读取示例文件,然后处理完整的床文件。
awk 'BEGIN{OFS="\t"}(FNR==NR){a[$0]; next}{for(i in a){f=FILENAME"."i; print $0,i > f}}' sample.txt bed.txthttps://stackoverflow.com/questions/73608854
复制相似问题