for循环中的Awk打印文件名

问题描述 投票:0回答:1

我正在对目录中的几个文件进行循环。 for循环中的每个命令都将以前的.txt附加新列。当前,for循环中的第三行创建一个带有文件路径的列,但我只需要文件名-我也不需要文件扩展名。我玩过拆分并重新分配到awk的过程,但是没有运气。

调整awk命令以仅获取文件名后,我想制作一个包含所有循环值的主.txt文件。本质上,我认为我需要在每个循环的输出后附加一个.txt文件。现在,这就是我要在for循环第三行中使用的管道,但是它只是创建一个空的.txt文件。

for file in ~/Desktop/test/*bam
do
    bedtools multicov -bams "$file" -bed bed_for_multicov.bed >  "${file%%_RRemoved.bam}_counts.txt"
    awk '{print $0,a}' a="$(samtools view -c "$file")" ${file%%_RRemoved.bam}_counts.txt > ${file%%_RRemoved.bam}_CPMcounts.txt
    awk -v var="$file" '{print $0, var}' ${file%%_RRemoved.bam}_CPMcounts.txt > ${file%%_RRemoved.bam}_CPMcounts2.txt | >> CPMcountsMaster.txt
done

当前文件名1_CPMcounts2.txt输出

chr1    11088   11488   peak_1  192 4409922 path/to/filename1.bam
chr1    20674   21215   peak_2  217 4409922 path/to/filename1.bam
chr1    28550   28862   peak_3  170 4409922 path/to/filename1.bam
chr1    29582   30300   peak_4  437 4409922 path/to/filename1.bam
chr1    30635   31720   peak_5  696 4409922 path/to/filename1.bam
chr1    32373   35541   peak_6  2877 4409922 path/to/filename1.bam

当前文件名2_CPMcounts2.txt输出

chr1    11088   11488   peak_1  293 5888360 path/to/filename2.bam
chr1    20674   21215   peak_2  439 5888360 path/to/filename2.bam
chr1    28550   28862   peak_3  392 5888360 path/to/filename2.bam
chr1    29582   30300   peak_4  901 5888360 path/to/filename2.bam

所需的filename1_CPMCounts2.txt输出

chr1    11088   11488   peak_1  192 4409922 filename1
chr1    20674   21215   peak_2  217 4409922 filename1
chr1    28550   28862   peak_3  170 4409922 filename1
chr1    29582   30300   peak_4  437 4409922 filename1
chr1    30635   31720   peak_5  696 4409922 filename1
chr1    32373   35541   peak_6  2877 4409922 filename1

所需的最终CPMcountsMaster.txt

chr1    11088   11488   peak_1  192 4409922 filename1
chr1    20674   21215   peak_2  217 4409922 filename1
chr1    28550   28862   peak_3  170 4409922 filename1
chr1    29582   30300   peak_4  437 4409922 filename1
chr1    30635   31720   peak_5  696 4409922 filename1
chr1    32373   35541   peak_6  2877 4409922 filename1
chr1    11088   11488   peak_1  293 5888360 filename2
chr1    20674   21215   peak_2  439 5888360 filename2
chr1    28550   28862   peak_3  392 5888360 filename2
chr1    29582   30300   peak_4  901 5888360 filename2
for-loop awk filenames
1个回答
0
投票

以下作品摘自J Leffler的评论-谢谢!

for file in ~/Desktop/test/*bam
do
    bedtools multicov -bams "$file" -bed bed_for_multicov.bed >  "${file%%_RRemoved.bam}_counts.txt"
    awk '{print $0,a}' a="$(basename "$file" _RRemoved.bam)" ${file%%_RRemoved.bam}_CPMcounts.txt > ${file%%_RRemoved.bam}_CPMcounts2.txt
    awk '{print $0,a}' a="$(basename "$file" _RRemoved.bam)" ${file%%_RRemoved.bam}_CPMcounts.txt >> CPMcountsMaster.txt
done
© www.soinside.com 2019 - 2024. All rights reserved.