Использование переменных из текстового файла в сценариях

Я хотел бы использовать программу командной строки (в частности, geotifcp ), которая принимает file_a.tif и file_a.tfw и выводит file_b.tif. По сути, он объединяет два файла с одинаковыми именами с разными расширениями и создает новый файл. Я хотел бы выяснить, как собрать несколько тысяч таких вещей. Я создал списки всех этих файлов, используя основные команды ls > output.
Я не обязательно ищу ответ, нацеленный на эту программу, но больше на сценарии в целом.
Я также не ищу, чтобы вы написали это для меня, просто подтолкните меня в общем направлении, пожалуйста.

Спасибо за любую помощь!

1
задан 6 May 2011 в 02:05

3 ответа

Я склонен делать подобные вещи, используя sed или awk для построения командных строк, а затем перенаправлять их в оболочку. В качестве возможного примера, если у вас есть файл только с именами файлов xxxxx_a.tif,

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

, чтобы увидеть, генерирует ли он команды, которые вы ищете, тогда

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

запустить их всех.

Строка ввода asdfasdfsadf_a.tif приводит к geotifcp asdfasdfsadf_a.tif asdfasdfsadf_a.tfw asdfasdfsadf_b.tif, предполагая, что имена файлов ввода - [filename]_a.tif и [filename]_a.tiw и имя выхода [filename]_b.tif.

0
ответ дан 6 May 2011 в 02:05

Я предлагаю, чтобы Вы взглянули на

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

и

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

в сочетании с передачей по каналу вывода одной команды во вход следующего (как от ls до sed к xargs)

К остроумию, скажем, у Вас есть каталог с *tif и *tfw файл. Вы хотите сделать что-то в tif файлы с помощью соответствующего tfw файла. Давайте также примем для каждого tif файла существует tfw файл того же самого имени

# 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

Последняя строка могла бы в значительной степени сделать то, в чем Вы нуждаетесь в одном длинном (трудный читать) командная строка без сценариев.

Для помощи пониманию, можно также сначала создать список файлов, как Вы сделали:

ls *tif> output.list

Затем очистите его с sed, чтобы удостовериться, что это ведет себя хорошо.

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

закончите затем используют xargs с опцией-p вместо-t для получения подсказки перед выпуском каждой команды:

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

Править: Вариация на первого должна использовать больше sed меньше xargs. Это также немного более 'debuggable'. Это действительно требует, чтобы Вы узнали немного о регулярных выражениях (который определенно стоит усилия).

По существу можно генерировать текст Вашей желаемой команды полностью с sed

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

Я знаю, regex выглядит ужасным, но здесь является грубым объяснением содержания в одинарных кавычках: 's/A/B /' занимает место с B в нашем случае, (что-то) .tif (обратите внимание, что мы должны выйти из скобок), что-то хранится в \1 и привыкает для создания команды geotifcp (который является B).

1
ответ дан 6 May 2011 в 02:05

Аргументы командной строки

Вы, вероятно, что использовать аргументы командной строки.

Попробуйте этот сценарий bash:

#!/bin/bash

echo "First argument is $1"
echo "Second argument is $2"

Если имя файла сценария test1.sh, то у вас будет следующее:

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

Чтение строк из файлов

Другим компонентом будет цикл по вашему файлу. Вы можете сделать это так:

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

Вместо echo "${line}" вы можете, например, сделать ./test1.sh ${line}.tif ${line}.tiw

0
ответ дан 6 May 2011 в 02:05

Другие вопросы по тегам:

Похожие вопросы: