【问题标题】:Output filename from input in bash从bash中的输入输出文件名
【发布时间】:2014-09-08 17:48:13
【问题描述】:

我有这个脚本:

#!/bin/bash
FASTQFILES=~/Programs/ncbi-blast-2.2.29+/DB_files/*.fastq
FASTAFILES=~/Programs/ncbi-blast-2.2.29+/DB_files/*.fasta
clear
for file in $FASTQFILES
do cat $FASTQFILES | perl -e '$i=0;while(<>){if(/^\@/&&$i==0){s/^\@/\>/;print;}elsif($i==1){print;$i=-3}$i++;}' > ~/Programs/ncbi-blast-2.2.29+/DB_files/"${FASTQFILES%.*}.fasta"
mv $FASTAFILES ~/Programs/ncbi-blast-2.2.29+/db/

done

我正在尝试获取$FASTQFILES 中定义的文件,将.fastq 转换为.fasta,使用与输入相同的文件名命名输出,然后将其移动到新文件夹。例如,~/./DB_files/HELLO.fastq 应该给出转换后的~/./db/HELLO.fasta

问题在于转换的输出是第一个文件夹中名为.fasta 的正确格式的隐藏文件,而不是预期的名为HELLO.fasta 的隐藏文件。所以mv 没什么。我认为我在 ${FASTQFILES%.*}.fasta 参数中搞砸了,但我似乎无法修复它。

【问题讨论】:

    标签: bash input output filenames


    【解决方案1】:

    我看到三个问题:

    1. 你的一个问题是你使用cat $FASTQFILES而不是cat $file

    2. 您还需要将该行末尾的 I/O 重定向修复为 &gt; ~/Programs/ncbi-blast-2.2.29+/DB_files/"${file%.fastq}.fasta"

    3. mv命令需要在循环外执行。

    实际上,在一次处理单个文件时,根本不需要使用catUUOC — 无用的 Cat)。只需提供 "$file" 作为 Perl 脚本的参数即可。

    【讨论】:

    • 非常感谢您的帮助!以下是我使用您的建议解决它的方法。它可能更优雅,但它可以工作......#!/bin/bash FASTQFILES=~/Programss/ncbi-blast-2.2.29+/DB_files/*.fastq FASTAFILES=~/Programss/ncbi-blast-2.2.29+/DB_files/*.fasta clear for file1 in $FASTQFILES do &lt;$file1 perl -e '$i=0;while(&lt;&gt;){if(/^\@/&amp;&amp;$i==0){s/^\@/\&gt;/;print;}elsif($i==1){print;$i=-3}$i++;}' &gt; "${file1%.fastq}.fasta" done for file2 in $FASTAFILES do mv $file2 ~/Programss/ncbi-blast-2.2.29+/db/ done
    • 还不错;您也可以像以前一样将输入重定向到 Perl。您不需要围绕mv 命令的循环;它将一次移动多个文件:mv $FASTAFILES ~/Programss/ncbi-blast-2.2.29+/db/。但是,循环将起作用。文件名中不能有空格,脚本才能正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2015-04-18
    • 2015-08-12
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多