Вот скрипт, который вы можете запустить, например, такой:
./move_files.sh lung
Это работает для обоих случаев (легкие и кости) и является общим. Поместите это в файл с именем move_files. sh:
#!/usr/bin/env bash
files=$(sed -e "s/\([0-9]\{3\}\)\( *$1\)/\1/g" <(grep $1 eg.sheet))
if [ ! -d $1 ]; then
mkdir $1
fi
for t in ${files[@]}; do
mv "./$t.tsv" $1
done
со следующим содержимым каталога:
101112.tsv 123.tsv 124.tsv 131415.tsv 456.tsv 457.tsv 789.tsv eg.sheet move_files.sh
и eg.sheet , содержащий:
sampleID tissue
123 lung
124 bone
456 lung
457 bone
... запуск сценария с
./move_files.sh lung
... приводит к 123.tsv и 456.tsv перемещается во вновь созданный каталог lung (или просто перемещается туда, если каталог уже существует).
Затем можно просто запустить
./move_files.sh bone
для переместите 124.tsv и 457.tsv во вновь созданный каталог bone . Конечно, это тогда можно обобщить на все, что есть в например. Лист .
Примечание: вы должны запустить chomd +x move_files.sh
, чтобы использовать его в так, как я предложил. В противном случае вы можете вызвать его с помощью bash move_files.sh lung
.
РЕДАКТИРОВАТЬ:
Для решения вопроса, поднятого keithpjolley в комментариях, это все равно может работать с «тканями», такими как «eye la sh», просто заключая в кавычки переменную $1
и вызывая ее с помощью строки в кавычках (например, ./move_files.sh "eye lash"
):
#!/usr/bin/env bash
files=$(sed -e "s/\([0-9]\{3\}\)\( *$1\)/\1/g" <(grep "$1" eg.sheet))
if [ ! -d "$1" ]; then
mkdir "$1"
fi
for t in ${files[@]}; do
mv "./$t.tsv" "$1"
done