使用 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
.
我正在尝试获取我的 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
.