динамически передавать строку в аргумент Rscript с помощью sed - PullRequest
0 голосов
/ 29 апреля 2020

Я написал скрипт на R, который имеет несколько аргументов. Я хочу перебрать более 20 каталогов и выполнить каждый сценарий, передавая подстроку из пути к файлу в качестве аргумента -n, используя sed. Я запустил следующее:

find . -name 'xray_data' -exec sh -c 'Rscript /Users/Caitlin/Desktop/DeMMO_Pubs/DeMMO_NativeRock/DeMMO_NativeRock/R/scipts/dataStitchR.R -f {} -b "{}/SEM_images" -c "{}/../coordinates.txt" -z ".tif" -m ".tif" -a "Unknown|SEM|Os" -d "overview" -y "overview" --overview "overview.*tif" -p FALSE -n "`sed -e 's/.*DeMMO.*[/]\(.*\)_.*[/]xray_data/\1/' "{}"`"' sh {} \;

, что приводит к этой ошибке:

ubs/DeMMO_NativeRock/DeMMO_NativeRock/R/scipts/dataStitchR.R -f {} -b "{}/SEM_images" -c "{}/../coordinates.txt" -z ".tif" -m ".tif" -a "Unknown|SEM|Os" -d "overview" -y "overview" --overview "overview.*tif" -p FALSE -n "`sed -e 's/.*DeMMO.*[/]\(.*\)_.*[/]xray_data/\1/' "{}"`"' sh {} \;
sh: command substitution: line 0: syntax error near unexpected token `('
sh: command substitution: line 0: `sed -e s/.*DeMMO.*[/](.*)_.*[/]xray_data/1/ "./DeMMO1/D1T3rep_Dec2019_Ellison/xray_data"'

Когда я пытаюсь использовать sed с моим шаблоном в пути к файлу примера, он работает:

echo "./DeMMO1/D1T1exp_Dec2019_Poorman/xray_data" | sed -e 's/.*DeMMO.*[/]\(.*\)_.*[/]xray_data/\1/'

, которая производит правильную подстроку:

D1T1exp_Dec2019

Я думаю, что есть проблема с попыткой использовать одинарные кавычки внутри интерпретируемой строки, но я не знаю, как с этим справиться. Я попытался заменить одинарные кавычки вокруг шаблона sed двойными кавычками, а также удалить одинарные кавычки, оба приводят к этой ошибке:

sed: RE error: illegal byte sequence

Как мне динамически извлечь подстроку из пути к файлу в этом случай

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

К l oop через вывод find.

while IFS= read -ru "$fd" -d '' files; do
  echo "$files"  ##: do whatever you want to do with the files here.
done {fd}< <(find . -type f -name 'xray_data' -print0)
  • Нет встроенных команд в кавычках.

  • Используется случайный fd на всякий случай, если что-то внутри l oop ест / хлебает stdin

  • Также -print0 разделяет файлы с null байтами, поэтому должно быть достаточно безопасны для обработки пробелов табуляции и новых строк в путях и именах файлов.

  • Хорошее начало - всегда ставить echo перед каждой командой, которую вы хотите сделать с файлами, так что у вас есть идея, что будет выполнено / произойдет на всякий случай ...

0 голосов
/ 29 апреля 2020

Это решение, которое в конечном итоге сработало для меня из-за проблем с кавычками в sed:

for dir in `find . -name 'xray_data'`; 
do sampleID="`basename $(dirname $dir) | cut -f1 -d'_'`";
Rscript /Users/Caitlin/Desktop/DeMMO_Pubs/DeMMO_NativeRock/DeMMO_NativeRock/R/scipts/dataStitchR.R -f "$dir" -b "$dir/SEM_images" -c "$dir/../coordinates.txt" -z ".tif" -m ".tif" -a "Unknown|SEM|Os" -d "overview" -y "overview" --overview "overview.*tif" -p FALSE -n "$sampleID"; 
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...