Salve a lista de saídas de eco em .txt

2

Estou tendo muitos problemas no trabalho tentando salvar uma longa lista de saídas de eco como um arquivo .txt na minha área de trabalho. Eu estou usando o Bash no Yosemite 10.10.4. Eu ainda sou muito novo no Bash, então qualquer ajuda e dicas são bem-vindas.

O objetivo é imprimir o nome do protocolo usado por varredura do cérebro, para uma longa lista de varreduras cerebrais. Eu usei um loop para percorrer recursivamente cada varredura do cérebro, puxe o protocolo usado, depois faça eco e o caminho para o arquivo exato usado para adquirir essa informação.

Meu script:

for i in /Path/to/scans/
do

for file in "$i/"001*/0001.dcm
do

# If there is no such file here, just skip this scan.
if [ ! -f "$file" ]
then
echo "Skipping $i, no 0001.dcm file here" >&2
continue
fi

# Otherwise take the protocol data from scan out
line= dcmdump +P 0040,0254 0001.dcm 
## dcmdump is the command line tool needed to pull out this data. 
## In my case I am saving to variable "line" the protocol used in 
## the scan that this single 0001.dcm file belongs to (scans require 
## many .dcm files but each one contains this kind of meta-data).

# Print the result
echo "$line $file"

break
done
done

Então, esse script quase funciona. Na minha janela do Terminal, eu recebo uma longa lista de protocolos usados e o caminho de arquivo absoluto para o arquivo 0001.dcm usado para cada varredura.

Meu problema é, quando eu mudo para

echo "$line $file" >> /Users/me/Desktop/scanparametersoutput.txt

O arquivo de texto que aparece na minha área de trabalho está em branco. Alguém tem alguma ideia sobre o que estou fazendo errado?

    
por Jordan Garner 13.08.2015 / 00:44

2 respostas

6

Um problema que você está tendo com seu script está nesta linha:

line= dcmdump +P 0040,0254 0001.dcm

Em vez de atribuir a saída de dcmdump a line , ele está executando o comando dcmdump com uma variável de ambiente chamada line set to '' . Você pode ler mais sobre isso aqui .

Então, o que você está realmente vendo é a saída de dcmdump sendo executada pelo seu script, não a saída de $line , já que $line não está sendo atribuído a nada.

Para capturar a saída de um programa, use a sintaxe

line=$(dcmdump +P 0040,0254 0001.dcm)

(Observe também que não há espaço antes ou depois do sinal = ser seguro.)

$() executa o código dentro dos parênteses em um subshell e, em seguida, "substitui" a si mesmo por aquela saída desse código.

Você provavelmente quer que 0001.dcm dentro do comando dcmdump seja $file , mas não estou familiarizado com isso, então deixarei isso para você.

    
por 13.08.2015 / 01:08
3

Como rmelcer mencionou, a variável line não está sendo definida e parece que o dcmdump não está sendo executado no arquivo correto:

line=$(dcmdump +P 0040,0254 "$file")

A configuração e a estrutura do script parecem um pouco mais complexas do que precisam ser.

O loop path externo não faz um loop, mas isso pode ser apenas para o seu exemplo?

É improvável que seu teste de arquivo falhe, a menos que você tenha diretórios chamados 0001.dcm, conforme procura especificamente por 0001.dcm no loop for .

for path in /Path/to/scans/; do
  for file in "$path/"001*/0001.dcm; do

    # If there is no such file here, just skip this scan.
    if [ ! -f "$file" ]; then
      echo "Skipping $file, no 0001.dcm file here" >&2
      continue
    fi

    # Otherwise take the protocol data from scan out
    line=$(dcmdump +P 0040,0254 "$file") 

    # Print the result
    echo "$line $file"

  done
done

Se você conseguir lidar com o nome do arquivo em primeiro lugar na sua saída, isso pode ser um pouco mais simples usando find :

find /Path/to/scans/001* \
  -name 0001.dcm \
  -type f \
  -printf "%p " -exec dcmdump +P 0040,0254 {} + \
| tee /Users/me/Desktop/scanparametersoutput.txt

Isso exibe em /Path/to/scans/001* os arquivos ( -type f ) chamados 0001.dcm ( -name 0001.dcm ), imprime o caminho completo para o arquivo ( -printf "%p " ) e executa o comando dcmdump no arquivo ( -exec xxx {} + ).

A saída do comando find é então canalizada para tee , que é impressa na tela e também para o arquivo especificado ( /Users/me/Desktop/scanparametersoutput.txt )

    
por 13.08.2015 / 01:35