約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