私はUnix / Linuxシステムでスクリプトと作業に初めて触れたので、助けてくれて本当に感謝します。この質問は以前に答えたことがあると確信していますが、他の解決策のどれも私の状況に適していない理由はわかりません。
複数のgzipで圧縮されたASCIIテキストファイルを含むディレクトリがあります。文字列rb
、it
およびが名前の5番目と6番目の場所にあるかどうかに応じて、ファイル名に基づいて区切る必要がありますv3
。v4
以下は、ディレクトリ内のファイル名がどのように見えるかについての例です。
M07Zv3REP1_S442_L001_R1_001.fastq.gz
M07Zv3REP1_S442_L001_R2_001.fastq.gz
M18ZitREP3_S276_L001_R2_001.fastq.gz
M10ZrbREP3_S535_L001_R1_001.fastq.gz
M10ZrbREP3_S535_L001_R2_001.fastq.gz
M09Zv4REP1_S300_L001_R1_001.fastq.gz
M09Zv4REP1_S300_L001_R2_001.fastq.gz
さまざまなgrepオプションを試しましたが、すべてのファイルを返します。例えば
grep -FLZ "rb" *.fastq.gz
私はxargsを使ってgrepファイルを新しいディレクトリに移動すると思いますが、一致する正しいzipファイルを取得する方法について心配しています。問題は、grepがすべてのfastqファイルで検索することです。この場合、どこかに「rb」または「it」がある可能性があるため、すべてが返されます。
どんな助けでも大変感謝します!
答え1
はい、あなたが言ったように、grep
コマンドはファイル名の中を検索します。ファイルが圧縮されているため、バイナリデータで検索し、ファイルが十分に大きい場合は、そこからほとんどのランダムな2文字の文字列を見つけることができます。 thyが圧縮されていない場合でも、fastq品質行でこれらの文字列を見つけることができます。
このツールはファイル名ではなくファイルの内容を検索するため、正しいツールではgrep
ありません。この場合、単純なシェルのワイルドカードだけが必要です。表示されている例のように、文字列の1つがある場合、またはファイルを定義するのに十分であると100%確信している場合は、次のようにv3
しv4
ますrb
。it
mkdir v3 v4 rb it
for pat in v3 v4 rb it; do mv -- *"$pat"*gz "$pat"/; done
名前に含まれているが5番目と6番目の場所にないファイルが計算されないように、特定の場所も考慮する必要がある場合は、次のように表示する必要がありますv3
。
mkdir v3 v4 rb it
for file in *gz; do
pat=$(printf '%s' "$file" | cut -c 5-6)
mv -- "$file" "$pat"/
done