Usando variáveis de um arquivo de texto em Scripting

1

Eu gostaria de usar um programa de linha de comando (especificamente geotifcp ) que usa file_a.tif e file_a.tfw e imprime o arquivo_b.tif. Basicamente, ele combina dois arquivos de mesmo nome com extensões de arquivo diferentes e ataca o novo arquivo. Eu gostaria de descobrir como extrair alguns milhares dessas coisas. Eu criei listas de todos esses arquivos usando os comandos básicos ls > output .
Eu não estou necessariamente procurando por uma resposta direcionada a este programa, mas mais em scripts em geral. Eu também não estou procurando por você para escrever isso para mim, apenas me dê um empurrão na direção geral, por favor.

Obrigado por qualquer ajuda!

    
por Paul 06.05.2011 / 00:05

3 respostas

1

Eu costumo fazer coisas assim usando sed ou awk para construir linhas de comando, depois canalizá-las para um shell. Como um exemplo possível, se você tiver um arquivo com apenas os nomes dos arquivos xxxxx_a.tif,

sed -e 's/\(.*\)_.*/geotifcp _a.tif _a.tfw _b.tif/' < list-file.txt

para ver se está gerando os comandos que você procura, então

sed -e 's/\(.*\)_.*/geotifcp _a.tif _a.tfw _b.tif/' < list-file.txt | sh

para executá-los todos.

Uma linha de entrada de asdfasdfsadf_a.tif resulta em geotifcp asdfasdfsadf_a.tif asdfasdfsadf_a.tfw asdfasdfsadf_b.tif , supondo que os nomes dos arquivos de entrada sejam [filename]_a.tif e [filename]_a.tiw e o nome da saída [filename]_b.tif .

    
por Mike 06.05.2011 / 02:23
1

Argumentos da linha de comando

Você provavelmente usa os argumentos da linha de comando.

Experimente este script bash:

#!/bin/bash

echo "First argument is "
echo "Second argument is "

Se o nome do arquivo de script for test1.sh , você terá isso:

a@u1104:~$ chmod +x test1.sh 
a@u1104:~$ ./test1.sh 
First argument is 
Second argument is 
a@u1104:~$ ./test1.sh file1.tif file2.tiw
First argument is file1.tif
Second argument is file2.tiw

Lendo linhas de arquivos

Outro componente seria percorrer o seu arquivo. Você pode fazer assim:

cat test |while read line; do 
  echo "${line}"
done

Em vez de echo "${line}" , você pode, por exemplo, fazer ./test1.sh ${line}.tif ${line}.tiw

    
por Aleksandr Levchuk 06.05.2011 / 01:48
1

Eu sugiro que você dê uma olhada em

sed # to manipulate text output from, for instance, ls

e

xargs # to use some std input to generate (many) new command lines

em combinação com a saída de um comando para a entrada do próximo (como de ls para sed para xargs)

Para dizer, você tem um diretório com o arquivo * tif e * tfw. Você quer fazer algo com os arquivos tif usando o arquivo tfw correspondente. Vamos supor também que para cada arquivo tif existe um arquivo tfw com exatamente o mesmo nome

# list all those tif files in one long column
ls -1 *.tif 

# chop of the end .*tif leaving you with the base name
ls *.tif | sed -s 's/\.tif$//'

# feed the previous into xargs to tag a tif with the info in a tfw and
# create new geo_*.tif file
ls *.tif | sed -s 's/\.tif$//' | xargs -i -t geotifcp -e {}.tfw {}.tif geo_{}.tif

A última linha pode muito bem fazer o que você precisa em uma linha de comando longa (difícil de ler) sem script.

Para ajudar na compreensão, você também pode criar a lista de arquivos da seguinte maneira:

ls *tif> output.list

Depois limpe-o com sed para se certificar de que se comporta bem.

sed -s 's/\.tif$//' output.list > clean_output.list

end então use xargs com a opção -p em vez de -t para obter um prompt antes da emissão de cada comando:

cat clean_output.list | xargs -i -p geotifcp -e {}.tfw {}.tif geo_{}.tif

EDITAR : Uma variação do primeiro é usar mais sed e menos xargs. Isso também é um pouco mais 'debuggable'. Isso requer que você aprenda um pouco sobre expressões regulares (que vale o esforço).

Essencialmente, pode-se gerar o texto do seu comando desejado inteiramente com o sed

sed -s 's/\(.*\)\.tif$/geotifcp -e .tfw .tif geo_.tif/'  output.list > process.sh

Eu sei, regex parece horrível, mas aqui está a explicação aproximada do conteúdo nas citações simples: 's / A / B /' substitui A por B A no nosso caso é (algo) .tif (note que temos que escapar dos parênteses) O algo é armazenado em \ 1 e é usado para construir o comando geotifcp (que é B).

    
por DrSAR 06.05.2011 / 02:22