我有一个包含许多 fastq 文件的目录。我正在使用此命令来计算读取长度并输出到新文件中。
sed -n '2~4p' FAX08345_abafd786_a8df7914_1131.fastq | awk '{ print length }' > len.text
我想将此命令应用于目录中的所有 fastq 文件,并且我需要输出以创建唯一的文件名 len.x,例如,其中 x = fastq 的文件名。
我在 Bash 工作。
这是我的文件列表的片段:
FAX08345_abafd786_a8df7914_1131.fastq FAX08345_abafd786_a8df7914_1173.fastq FAX08345_abafd786_a8df7914_60.fastq
FAX08345_abafd786_a8df7914_1135.fastq FAX08345_abafd786_a8df7914_1175.fastq FAX08345_abafd786_a8df7914_64.fastq
听起来这可能就是您想要做的:
awk '
FNR == 1 { close(out); out="len."FILENAME }
FNR >= 2 { print length() > out }
FNR == 4 { nextfile }
' *.fastq
nextfile
那么将其更改为:
awk '
FNR == 1 { close(out); out="len."FILENAME }
(2 <= FNR) && (FNR <= 4) { print length() > out }
' *.fastq
它的运行速度只会比您使用
nextfile
慢一点。
如果输入文件为空或包含的行数少于 2 行,则上述内容不会生成输出文件。如果这是一个问题,那么请更新您的问题,将此类情况包含在示例输入/输出中,并说明应如何处理以及您使用的 awk 变体(因为使用 GNU awk for
BEGINFILE/ENDFILE
更容易处理)。
我建议,给定一个输入文件
foo.fastq
,不要创建名为 len.foo.fastq
的输出文件,而是创建一个名为 foo.fastq.len
或 foo.len
的输出文件,这样,如果您必须再次运行该工具,则 *.fastq
shell 通配不会获取您的 len
文件。为此,请使用以下任一方法代替 out="len."FILENAME
:
out=FILENAME".len"
out=FILENAME; sub(/\.[^.]+$/,".len",out)