我需要幫助將 awk 與回圈結合起來。
我有兩個檔案,一個Bedfile.bed
和一個Samplelist.txt
看起來像這樣:
床檔案.床
HiC_scaffold_2 1 50001
HiC_scaffold_2 400001 450001
HiC_scaffold_2 800001 850001
樣本串列.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 SampleA
Bedfile_SampleB.bed
HiC_scaffold_2 1 50001 SampleB
HiC_scaffold_2 400001 450001 SampleB
HiC_scaffold_2 800001 850001 SampleB
我已經為一個檔案完成了此操作,但我有一百多個檔案,所以我想使用示例串列進行某種回圈。
awk ' {print $1"\t"$2"\t"$3"\t""SampleA"}' Bedfile.bed > Bedfile_SampleA.bed
有什么建議嗎?
uj5u.com熱心網友回復:
$ 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 一起作業。
uj5u.com熱心網友回復:
因此在 awk 中非常簡單。首先讀取記憶體中的示例檔案,然后處理完整的床檔案
awk 'BEGIN{OFS="\t"}(FNR==NR){a[$0]; next}{for(i in a){f=FILENAME"."i; print $0,i > f}}' sample.txt bed.txt
uj5u.com熱心網友回復:
您可以在 AWK 中執行所有操作和回圈,但如果您出于其他原因想要“單獨”執行回圈,您可以使用:
while read -r sample
do
awk -v var="$sample" 'BEGIN{OFS="\t"} {print $0, var}' bedfile.bed > bedfile_"$sample".bed
done < samplelist.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/505238.html
上一篇:運行for回圈以重命名列