Как организовать изображения в каталоге в классы, зависящие от значений столбцов данных?

Я сделал пару вещей, чтобы избавиться от этой досадной ошибки, поскольку модификация .ini никогда не работала для меня.

  1. Установлен последний JDK
  2. Полностью удалить старую папку Eclipse IDE.
  3. На этот раз i Разархивировано в другое место

Двойной щелчок «eclipse.exe» Работает теперь как charm. Используйте рабочее пространство по умолчанию для загрузки старых проектов.

Я подозреваю, что это проблема Java Java JDK больше, чем затмение.

1
задан Socowi 1 March 2019 в 09:30
поделиться

3 ответа

Основная команда

Этот ответ использует тот же подход, что и ответ Индера , но внутри одной команды awk, которая могла бы быть быстрее. Не то чтобы это имело значение в этом случае ... Здесь мы предполагаем, что файл, указанный в вашем примере, в качестве входных данных, см. Следующий раздел для альтернативных форматов ввода.

awk 'NR>1 { system("mkdir -p dir"$2"; mv "$1"-* dir"$2) }' dataframe.csv

В вашем примере это выполняет следующие команды bash:

mkdir -p dir0
mv abc-* dir0
mkdir -p dir0
mv def-* dir0
mkdir -p dir2
mv abg-* dir2
mkdir -p dir1
mv poc-* dir1
mkdir -p dir4
mv qrs-* dir4

Опция -p в mkdir не вызовет ошибку, если каталог уже существует. С помощью mv abc-* dir0 мы перемещаем все файлы, начиная с abc-, в каталог dir0.

Использование вашего фактического формата ввода

Из комментариев кажется, что ваш фактический файл имеет другой формат, чем пример, который вы показали нам. В примере столбцы были разделены пробелами

animal    class
abc        0
def        0
abg        2
...

, но ваш реальный файл выглядит как настоящий csv со столбцами, разделенными запятыми. Кроме того, файл, кажется, имеет окончания строки Windows (\r\n вместо \n).

animal,class\r
abc,0\r
def,0\r
abg,2\r
...

Вы можете использовать этот формат, адаптируя специальные переменные awk FS (для разделителя полей) и RS (для разделителя записей):

awk -F, -v RS='\r?\n' 'NR>1 { system("mkdir -p dir"$2"; mv "$1"-* dir"$2) }' dataframe.csv
0
ответ дан Socowi 1 March 2019 в 09:30
поделиться

Это должно сработать, благодаря ценным данным @Socowi:

while read -r f1 f2 #store values of each row for first column and second
do

    mkdir "dir${f2}" #makes directory with the name
    mv ${f1}.* "dir${f2}/" #moves all the files with the class name to that directory 

done < <(tail +2 file.csv) #reads file line by line except first

PS file.csv - это файл, содержащий классы, их имена и т. Д., Количество файлов не имеет значения.

0
ответ дан Inder 1 March 2019 в 09:30
поделиться

Часто, когда я пишу умеренно сложный сценарий - или сценарий, который должен повторяться правильно большое количество раз - я не пишу сценарий, который выполняет работу, я пишу сценарий, который выводит последовательность команд, которые сделают работу. Таким образом, я могу потратить некоторое время, чтобы просмотреть вывод скрипта и определить, выглядит ли последовательность команд, сгенерированная им, разумной. Так как это всего лишь команды оболочки, я также могу включить комментарии в вывод скрипта, чтобы «показать мою работу» и подтвердить, что действия, выполняемые скриптом, основаны на звуковой логике.

Решение Индера действительно умно, достаточно подстановочного знака. Пока он писал это, я писал:

Пусть каталоги dirN уже созданы, таблица классов находится в файле class, а список файлов, которые нужно переместить в файл files. [ 117]

#!/usr/bin/env bash

# read in the class table:

eval $(
tail +2 classes |\
while read PREF CLASS
do
        echo X$PREF=$CLASS\;
done
)

# now iterate through the filenames:

while read FILE
do
        GROUP=${FILE%%-*}
        CLASS="X${GROUP}"
        printf '# file "%s" is group "%s", which is class "%s"\n' "$FILE" "$GROUP" "${!CLASS}"
        printf 'mv -vi "%s" "dir%s"\n' "$FILE" "${!CLASS}"
done < files

Выходные данные этого сценария:

$ ./foo.sh
# file "abc-1.jpg" is group "abc", which is class "0"
mv -vi "abc-1.jpg" "dir0"
# file "abc-2.jpg" is group "abc", which is class "0"
mv -vi "abc-2.jpg" "dir0"
# file "def-1.jpg" is group "def", which is class "0"
mv -vi "def-1.jpg" "dir0"
# file "abg-1.jpg" is group "abg", which is class "2"
mv -vi "abg-1.jpg" "dir2"
# file "abg-2.jpg" is group "abg", which is class "2"
mv -vi "abg-2.jpg" "dir2"
# file "abg-3.jpg" is group "abg", which is class "2"
mv -vi "abg-3.jpg" "dir2"
# file "poc-1.jpg" is group "poc", which is class "1"
mv -vi "poc-1.jpg" "dir1"
# file "qrs-1.jpg" is group "qrs", which is class "4"
mv -vi "qrs-1.jpg" "dir4"

Если эти команды выглядят нормально, запустите сценарий снова и направьте вывод в bash:

$ ./foo.sh  | bash
abc-1.jpg -> dir0/abc-1.jpg
abc-2.jpg -> dir0/abc-2.jpg
def-1.jpg -> dir0/def-1.jpg
abg-1.jpg -> dir2/abg-1.jpg
abg-2.jpg -> dir2/abg-2.jpg
abg-3.jpg -> dir2/abg-3.jpg
poc-1.jpg -> dir1/poc-1.jpg
qrs-1.jpg -> dir4/qrs-1.jpg

Сборка «мета-сценарий» таким образом позволяет проверять свою работу перед выполнением, возможно, не совсем корректного действия тысячи раз. Однако, это может быть непрактичным в тех случаях, когда существует не тысячи, а миллионы или миллиарды итераций. Тем не менее, если кто-то использует эту технику на небольшой подвыборке набора данных мамонта, это может быть очень полезным методом для отладки логики вашего скрипта без каких-либо недостатков или ошибок в вашем скрипте. Просто внимательно прочитайте вывод сценария, прежде чем направлять его в оболочку live bash.

0
ответ дан Jim L. 1 March 2019 в 09:30
поделиться
Другие вопросы по тегам:

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