他のファイルと一致する名前に基づいてファイルを別のディレクトリに移動します。

他のファイルと一致する名前に基づいてファイルを別のディレクトリに移動します。

約6000個のファイル(一部は.txtファイル、一部は.pdfファイル)があるフォルダがあり、これらのファイルを別のフォルダに整理しようとします。フォルダは次のとおりです。

$ ls ./res-defaults    
ML3020T1--ML3020N_chr6-209980-34769899-LOH_clusters.pdf
ML3020T1--ML3020N_chrom_clust_freqs.txt
ML3020T1--ML3020N_cluster_summary.txt
ML3020T1--ML3020N_mol_time_estimate.pdf
HTMCP-01-01-00451-01A-01D--HTMCP-01-01-00451-11B-01D_boots.txt

....

その後、メタデータファイルである別のファイルがあります。

$ head meta.data
bam TRUE    81-52884    81-52884T   tumour  grch37  genome  A01423  DL_M    
bam TRUE    06-30342    ML3020T1    tumour  grch37  genome  A43002  ML_K        
bam TRUE    10-24757    10-24757T   tumour  grch37  genome  A61218  CL_GC
bam TRUE    HTMCP-01-01-00451   HTMCP-01-01-00451-01A-01D   tumour  grch37  genome  A71785  DL_HTMCP
    ....

文字列「これから」これ"——"res-defaultsフォルダのファイル名は、メタデータファイルの列4と一致します。

メタデータの列9に基づいてフォルダを作成し、res-defaultのファイルをメタデータの列4が「--」の前の文字と一致するディレクトリに移動しようとします。

私はこの結果を期待しています

$ ls ./ML_K
ML3020T1--ML3020N_chr6-209980-34769899-LOH_clusters.pdf
ML3020T1--ML3020N_chrom_clust_freqs.txt
ML3020T1--ML3020N_cluster_summary.txt
ML3020T1--ML3020N_mol_time_estimate.pdf

そして

$ ls./DL_HTMCP
HTMCP-01-01-00451-01A-01D--HTMCP-01-01-00451-11B-01D_boots.txt

正直なところ、bashシェルを使ってこれを行う方法がわかりません!

答え1

awk以下を使用して、4番目と9番目のフィールドを印刷できます。

$ awk '{print $4,$9}' meta.data
81-52884T DL_M
ML3020T1 ML_K
10-24757T CL_GC
HTMCP-01-01-00451-01A-01D DL_HTMCP

次にそれを渡し、read各フィールドを変数に割り当てます。次に、ターゲットディレクトリを作成し(mkdir -pディレクトリがすでに存在する場合は文句を言わないように使用します)、プレフィックス(4番目のフィールド)で始まるファイル名を9番目のフィールドで指定されたディレクトリ名に移動します。

awk '{print $4,$9}' meta.data | 
    while read prefix dirname; do 
        mkdir -p -- "$dirname" && mv -- "$prefix"* "$dirname"; 
    done

関連情報