манипулирование строками не работает в t csh - не понимаю переменные подпрограмм - PullRequest
0 голосов
/ 27 февраля 2020

прежде всего мой код:

#!/bin/tcsh
#linebroadening, zero filling, Fouriertransform, Phase Correction, automatic baseline corr.,output
xyz2pipe -in fid/test%03d.fid -x -verb                \
| nmrPipe -fn EM -lb 20.0                             \
| nmrPipe  -fn ZF -auto                               \
| nmrPipe -fn FT -auto                                \
| nmrPipe -fn PS -p0 90.0 -p1 0.0 -di                 \
| nmrPipe  -fn POLY -auto                             \
| pipe2xyz -out ft2_01/test%03d.ft2 -ov -verb
\
#ROIs:
xyz2pipe -in ft2_01/test%03d.ft2 -x -verb             \
| nmrPipe  -fn EXT -x1 -109ppm -xn -120ppm -sw        \
| pipe2xyz -out ft2_roi/test%03d.ft2 -ov -verb
\
mkdir -p ft2_sum
mkdir -p ft2_sum_txt
proj2D.tcl -in ft2_roi/test001.ft2 -sum -out ft2_sum/test001
pipe2txt.tcl ft2_sum/test001/1H.dat > ft2_sum_txt/test001.txt

Краткое описание кода до строки кода №. 17: обработка необработанных трехмерных данных, которые сохраняются в плоскостях двумерных данных в виде файлов .ft2. Их имена файлов такие: test001.ft2 test002.ft2. , , теперь я хотел перебрать два разных скрипта над этими файлами. Выше приведен рабочий пример того, как это работает для одного файла. К сожалению, я не понимаю, как эта запись %03d работает внутри xyz2pipe. Есть ли способ получить доступ к этому методу итерации напрямую с помощью сценариев proj2D.tcl и pipe2txt.tcl (может быть, через каналы оболочки)? Поэтому в качестве альтернативы я попытался самостоятельно манипулировать именами файлов, чтобы перебрать все соответствующие файлы:

foreach file (ft2_roi/*)
  echo $file
  echo $file/ft2_roi
  echo ${file%.ft2}
  echo ${file#ft2_roi/}
end

, что дает следующий вывод:

ft2_roi/test001.ft2
ft2_roi/test001.ft2/ft2_roi
Missing '}'.

Итак, манипуляции со строками echo ${file%.ft2} и echo ${file#ft2_roi/} не работает правильно Что я делаю неправильно? Спасибо за любой совет или помощь! С наилучшими пожеланиями, Ханнес

1 Ответ

0 голосов
/ 27 февраля 2020

удалось сделать это с другой программой "sed":

foreach dir (ft2_roi/*)
  echo 'dir:' $dir
  set file = `echo $dir | sed 's/.*\///'`
  set filename = `echo $file | sed -E 's/(.*?)\..*/\1/'`
  echo 'filename:' $filename
end

output:

dir: ft2_roi/test001.ft2
filename: test001

Вопрос об элегантном способе через %03d остается.

...