-1

現在、1 つのディレクトリ内のファイルの読み取りに問題があります。ファイル内のすべての fastq ファイルを取得し、各ファイルに対してスクリプトを実行してから、新しいファイルを「Edited_sequences」フォルダーに配置する必要があります。私が持っていた1つのスクリプトは

perl -ne '$i++; if($i<80001){print}' BM2003_TCCCAGAACAAC_L001_R1_001.fastq > ./Edited_sequences/BM2003_TCCCAGAACAAC_L001_R1_001.fastq

1 つの fastq ファイルで最初の 80000 行を取得し、結果を出力します。たとえば、2000 個の fastq ファイルがある場合、2000 回コピーして貼り付ける必要があります。この状況に適した glob コマンド スーツがあることは知っていますが、その対処方法がわかりません。私を助けてください。

4

3 に答える 3

0

次の 2 つの選択肢があります。

  • Perl を使用して 2000 ファイルを読み込み、プログラムの一部として実行します。
  • シェルを使用して、これらの 2000 ファイルのそれぞれをコマンド ラインに渡します。

これがbashの代替手段です:

for file in *.fastq
do
    perl -ne '$i++; if($i<80001){print}' "$file" > "./Edited_sequences/$file"
done

同じ Perl スクリプトですが、シェルが各ファイルを検索します。これ機能し、コマンド ラインが過負荷になることはありません。グロブが渡された場合、bashのforループはそれらを正しく展開できます。

ただし、実際にコマンドを実行するのではなく、結果のコマンドをファイルにエコーすることを常にお勧めします。

for file in *.fastq
do
    echo "perl -ne '\$i++; if(\$i<80001){print}' \
\"$file\" > \"./Edited_sequences/$file\""    >> myoutput.txt
done

次に、myoutput.txt実際に害を及ぼす前に、見栄えが良いことを確認できます。それが適切なファイルであると判断したらmyoutput.txt、それをシェル スクリプトとして実行できます。

$ bash myoutput.txt
于 2013-08-22T00:26:06.680 に答える
0

glob特定の式に一致するファイル名の配列を取得します。これは、入力の読み取りによく似ており、角かっこで頻繁に使用され<>ます (ディレクトリからファイルを読み取ると考えることができます)。

これは、現在のディレクトリにあるすべての「.fastq」ファイルの名前を出力する簡単な例です。

print "$_\n" for <*.fastq>;

重要な部分は です<*.fastq>。これにより、その表現に一致するファイル名の配列 (この場合はファイル拡張子) が得られます。Perl スクリプトが動作しているディレクトリを変更する必要がある場合は、chdir.

そこから、必要に応じてファイルを処理できます。

while (my $filename = <*.fastq>) {
    open(my $in, '<', $filename) or die $!;
    open(my $out, '>', "./Edited_sequences/$filename") or die $!;

    for (1..80000) {
        my $line = <$in>;
        print $out $line;
    }
}
于 2013-08-21T21:57:14.243 に答える