약 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
다음을 사용하여 네 번째 및 아홉 번째 필드를 인쇄 할 수 있습니다 .
$ 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