
Estoy procesando un lote de datos de sujetos de forma recursiva, llamando al script dentro del directorio principal.
Por ejemplo, tengo el directorio principal:
/home/subjects
y los subdirectorios que contienen los datos:
/home/subjects/0393
/home/subjects/0389
/home/subjects/9920 (Around 250 subjects)
Cada archivo en cada subdirectorio tiene la extensión de archivo ".nii". He compuesto un código que llama a una serie de comandos de un programa de neurociencia, buscando esa extensión de archivo en particular como entrada. La entrada al primer comando "fslroi" es el archivo .nii ($file), mientras que el archivo de salida de ese comando es "rawdata.nii". Como puede ver, la salida de un comando es la entrada al siguiente, etc.
for file in $(find ./ -name "*.nii")
do
fslroi $file rawdata.nii 0 33
gunzip rawdata.nii.gz -f
fslroi rawdata.nii rawnodif 0 1
bet rawnodif rawnodif_brain -m -g 0.2 -f 0.3
fslmaths rawnodif -mas rawnodif_brain_mask rawnodif_brain
gunzip rawnodif_brain_mask.nii.gz -f
done
Sin embargo, este código es inadecuado ya que no puedo guardar el resultado en el subdirectorio particular. Por lo tanto, mientras estoy procesando varios temas, el código no funcionará ya que todo se guarda en el directorio principal.
¿Podría alguien darme alguna pista sobre cómo puedo modificar el código para guardar el resultado de acuerdo con el archivo de entrada ".nii"?
Respuesta1
Desea utilizar dirname $file
para obtener el nombre del directorio de su archivo de entrada y anteponerlo al nombre del archivo de salida.
for file in $(find ./ -name "*.nii")
do
rawdata = $(dirname $file)/rawdata.nii
fslroi $file $rawdata 0 33
gunzip $rawdata.gz -f
fslroi $rawdata rawnodif 0 1
bet rawnodif rawnodif_brain -m -g 0.2 -f 0.3
fslmaths rawnodif -mas rawnodif_brain_mask rawnodif_brain
gunzip rawnodif_brain_mask.nii.gz -f
done
No está claro cuáles rawdata
son argumentos de comando reales o si todos son nombres de archivos. Mismos con rawnodif_brain_mask
los que quizás necesites adaptarte de la misma forma.
Respuesta2
Gracias, aquí está el guión final. Tenga en cuenta que $ denota un nombre de archivo, mientras que el resto son comandos o argumentos.
#!/bin/bash
for file in $(find ./ -name "*.nii")
do
rawdata=$(dirname $file)/rawdata.nii.gz
rawnodif=$(dirname $file)/rawnodif.nii.gz
rawnodif_brain=$(dirname $file)/rawnodif_brain.nii.gz
rawnodif_brain_mask=$(dirname $file)/rawnodif_brain.nii.gz
fslroi $file $rawdata 0 33
fslroi $rawdata $rawnodif 0 1
gunzip $rawdata -f
bet $rawnodif $rawnodif_brain -m -g 0.2 -f 0.3
fslmaths $rawnodif -mas $rawnodif_brain_mask $rawnodif_brain
gunzip $rawnodif_brain_mask -f
done