Linuxでは、ファイルの名前とパスを含む新しいファイルを作成します。

Linuxでは、ファイルの名前とパスを含む新しいファイルを作成します。

fastq.gz私のLinuxシステムのディレクトリにR1とR2という名前のファイルがいくつかあります。dir次のようになります。

dir
 |____sampleA_1.fastq.gz
 |____sampleA_2.fastq.gz
 |____sampleB_1.fastq.gz
 |____sampleB_2.fastq.gz
 |____sampleC_1.fastq.gz
 |____sampleC_2.fastq.gz

txt最初の列にサンプル名、2番目の列にR1 fastqパス、3番目の列にR2 fastqパスを使用してファイルを作成したいと思います。

内部では、dir以下を試しました。

find "$PWD" -name \*1.fastq.gz > list1.txt
find "$PWD" -name \*2.fastq.gz > list2.txt

両方のファイルを再結合して列名を指定し、サンプル名で別の列を再作成する必要があります。代わりに単一のコマンドでファイルを作成する方法はありますか?

ファイルはtxt次のようにする必要があります。

sample            Second                    Third
sampleA    dir/sampleA_1.fastq.gz     dir/sampleA_2.fastq.gz
sampleB    dir/sampleB_1.fastq.gz     dir/sampleB_2.fastq.gz
sampleC    dir/sampleC_1.fastq.gz     dir/sampleC_2.fastq.gz

ベストアンサー1

サンプルペアが常に存在することを保証できる場合、このbash/kshコードはすべてのサンプル1ファイルの存在に基づいて出力を生成します。

はい(デモ環境の構築):

mkdir -p /tmp/710303/dir
cd /tmp/710303
touch dir/sample{A,B,C}_{1,2}.fastq.gz       # Assumes a { }-aware shell

ファイルの作成(デモ環境で動作)

printf "%s %s %s\n" 'sample' 'Second' 'Third'
for f1 in dir/sample*_1.fastq*               # Loop through all first samples
do
    fn="${f1##*/}"; fn="${fn%%_*}"           # Label
    f2="${f1/1/2}"                           # Filename for second sample
    printf "%s %s %s\n" "$fn" "$f1" "$f2"    # Output the values
done

出力

sample Second Third
sampleA dir/sampleA_1.fastq.gz dir/sampleA_2.fastq.gz
sampleB dir/sampleB_1.fastq.gz dir/sampleB_2.fastq.gz
sampleC dir/sampleC_1.fastq.gz dir/sampleC_2.fastq.gz

これはスペースで区切られた列です。タブで区切るには、(スペース)の代わりに(タブ)をprintf使用するようにフォーマット行を変更します。\t

おすすめ記事