使用 printf 包括变量输出和命令

using printf to include both variable output and command

我正在尝试获取我的 fastq 文件的读取次数,我希望输出也包括我的文件名。我在网上找到了一个几乎可行的解决方案,但仍然没有得到正确的输出。示例:

我的文件名:

12S_C-T1-045_F_filt.fastq.gz
12S_C-T1-PL_F_filt.fastq.gz
...

我找到的代码:

for file in ./*.fastq.gz
do 
    file_name=$(basename -s .fastq $file)
    printf "$file_name\t$(cat ${file} | wc -l)/4|bc\n" >> no_reads_12S.txt
done

输出:

12S_C-T1-045_F_filt.fastq.gz 114/4|bc
12S_C-T1-PL_F_filt.fastq.gz 26455/4|bc
...

所以,显然计算不正确——数字甚至都不正确。我应该如何解决这个问题?我也试过这样做:

for file in ./*.fastq.gz
do 
    file_name=$(basename -s .fastq.gz $file)
    echo "$file_name"
    echo $(zcat $file | wc -l)/4|bc
done

这行得通,但它会在不同的行中为我提供文件名和读取编号。

谢谢!

基于第二个脚本,请你试试:

#!/bin/bash

for file in ./*.fastq.gz; do
    file_name=$(basename -s .fastq.gz "$file")
    printf "%s\t%d\n" "$file_name" "$(echo $(zcat "$file" | wc -l) / 4 | bc)"
done

或作为 one-liner:

for file in ./*.fastq.gz; do file_name=$(basename -s .fastq.gz "$file"); printf "%s\t%d\n" "$file_name" "$(echo $(zcat "$file" | wc -l) / 4 | bc)"; done

printf的概要是:

printf FORMAT [ARGUMENT]...

我们需要输入字符串作为参数。第一个参数 "$file_name" 会很明显。第二个参数 "$(echo $(zcat "$file" | wc -l) / 4 | bc)" 可能需要解释。首先是命令 $(zcat "$file" | wc -l) 被行数替换为命令管道的输出。 然后外部命令看起来像 $(echo <number> / 4 | bc) 然后它 被 bc 的结果替换并传递给 printf.