Вот один из возможных подходов, который, вероятно, не самый красивый и не самый оригинальный. Идея состоит в том, чтобы использовать регулярные выражения в awk для извлечения соответствующих битов из имен файлов. Затем мы переходим к созданию команды shell move (mv) в awk. Наконец, мы используем системную команду, доступную в awk, для выполнения команды и перемещения файлов в соответствующие подпапки.
Сначала попробуйте следующее, чтобы получить подробное описание:
find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2]; cmd=("mv " "" filename " " folder "/" subfolder); print "Command to be run: ", cmd }'
Результат:
Command to be run: mv ./Seaxxx_A01_xxx.jpg ./Seaxxx/A01
Command to be run: mv ./Mountain_xxx_A04A12_xxx.jpg ./Mountain/A04A12
Command to be run: mv ./Beach_xxx_A01A02_xxx.jpg ./Beach/A01A02
Для фактического выполнения команды, которую вы добавляете system (cmd) в конце оператора:
find . -mindepth 1 -maxdepth 1 -type f | awk '{ filename=$0; match(filename, "^([^_]+).*_(A.*)_", capture); folder=capture[1]; subfolder=capture[2]; cmd=("mv " "" filename " " folder "/" subfolder); print "Command to be run: ", cmd; system(cmd) }'
Единственное, что вам, вероятно, нужно, это чтобы настроить регулярное выражение в соответствии с вашими потребностями. Я предполагаю, что вы знакомы с регулярным выражением, здесь мы записываем две части имен файлов. Группы захвата заключены в круглые скобки.
Начиная с начала имени файла, мы захватываем все, что не является подчеркиванием, пока не найдем одно подчеркивание. Затем мы продолжаем поиск, пока не найдем шаблон A #####, где # представляют буквы / цифры (вторая группа захвата). Мы захватываем, пока не дойдем до следующего символа подчеркивания.
Предполагая, что вы уже вставили эти значения в таблицу, вы можете удалить из них символы пробела.
Предположим также, что столбцы в таблице называются c1
, c2
и c3
:
UPDATE x SET c1 = TRIM(c1), c2 = TRIM(c2), c3 = TRIM(c3);
Функция TRIM()
функция удалит как начальные, так и конечные пробелы.
Если вы хотите сначала проверить это на временной таблице:
CREATE TEMPORARY TABLE t AS SELECT * FROM x;
UPDATE t SET c1 = TRIM(c1), c2 = TRIM(c2), c3 = TRIM(c3);
SELECT * from t;
... или просто
SELECT TRIM(c1), TRIM(c2), TRIM(c3) FROM x;
, что вообще ничего не изменит в базе данных.
Совет SQL: при вставке значений обязательно упоминайте имена столбцов:
INSERT INTO x (c1, c2, c3) VALUES ('a', 'b', 'c');
Это одновременно служит документацией и позволяет изменять схему таблицы (вставлять новые столбцы или переупорядочивать столбцы) без необходимости поиска и измените каждый оператор INSERT
в вашем коде.
sed -e ':a' -e "s/\('[^' ]*\) */\1/g" -e ta file.txt
insert into x values('a','b','c');
insert into x values('m','n','p');
Мы используем механизм циклов в тандеме, чтобы постепенно очищать пробелы внутри пар одинарных кавычек '...', которые могут быть в строке. Обратите внимание, что предполагается отсутствие табуляций, но с ними также можно работать
sed -e ':a' -e "s/\('[^'[:space:]]*\)[[:space:]]\{1,\}/\1/g" -e ta
awk -F '(' '{ gsub(" ","",$2); print $1 FS $2; }' input.txt
Пояснение
$1 = insert into x values
$2 = 'a ',' b',' c ');
Выход:
insert into x values('a','b','c');
insert into x values('m','n','p');