For loop for循环中的Awk打印文件名

For loop for循环中的Awk打印文件名,for-loop,awk,filenames,For Loop,Awk,Filenames,我在一个目录中的几个文件上运行for循环。for循环中的每个命令都会在前一个.txt中追加一个新列。目前,for循环中的第3行创建了一个带有文件路径的列,但我只需要文件名,我也不需要文件扩展名。我一直在玩分裂和管道回到awk,但没有运气 在调整awk命令以仅获取文件名之后,我想创建一个包含所有循环值的master.txt文件。本质上,我认为我需要附加一个带有每个循环输出的.txt文件。现在我正试图对for循环第三行中的管道执行此操作,但它只创建了一个空的.txt文件 用于~/Desktop/te

我在一个目录中的几个文件上运行for循环。for循环中的每个命令都会在前一个.txt中追加一个新列。目前,for循环中的第3行创建了一个带有文件路径的列,但我只需要文件名,我也不需要文件扩展名。我一直在玩分裂和管道回到awk,但没有运气

在调整awk命令以仅获取文件名之后,我想创建一个包含所有循环值的master.txt文件。本质上,我认为我需要附加一个带有每个循环输出的.txt文件。现在我正试图对for循环第三行中的管道执行此操作,但它只创建了一个空的.txt文件

用于~/Desktop/test/*bam中的文件
做
bedtools MultiCV-bams“$file”-bed bed_for_multicov.bed>“${file%%\u RRemoved.bam}\u counts.txt”
awk'{print$0,a}'a=“$(samtools视图-c“$file”)”${file%%\u rremove.bam}\u counts.txt>${file%%\u rremove.bam}\u CPMcounts.txt
awk-v var=“$file”{print$0,var}${file%%\u RRemoved.bam}\u CPMcounts.txt>${file%%\u RRemoved.bam}\u CPMcounts2.txt |>>CPMcountsMaster.txt
完成
当前文件名1\u 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
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
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
当前文件名2\u 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
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
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
所需文件名1\u 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
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
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

以下作品改编自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

变量是。另见POSIX
FILENAME
也是一个标准的内置变量,因此它可能在大多数版本的
awk
中都可用。为什么
Desired Final CPMcountsMaster.txt
当前文件名2\u CPMcounts2.txt输出的行数更多?只需通过
basename\u file.bam将最后一列导入管道即可。你确定你展示的脚本可以工作吗?如果你想将basename作为“文件名”输出,那么用
a=$(samtools视图-c“$file”)“
替换为
a=$(basename$(samtools视图-c“$file”).bam)”
。注意现代
$(…)的优点之一
表示法是嵌套调用要比使用旧的反勾号表示法进行命令替换容易得多。文件名来自第3行,而不是包含samtools的那一行。我之前尝试了文件名,但它在for循环中不起作用-它调用了.txt文件的名称(不是循环中的$file)。作为一般性的评论,我对您得到的输出和变量替换的用法有点困惑。例如,您使用${file%%\u RRemoved.bam}这似乎意味着存储在$file中的文件名以字符串RRemoved.bam结尾。您上一次awk传递了相同的变量,但在输出中我们没有看到此字符串。您还有命令|>>outputfile。这是无效语法。始终尝试首先使用解析代码。这可以挽救生命!这是如何工作的,这与您的情况甚至不一样原稿?