Как я могу найти, какие csv-файлы связаны (т. Е. Имеют ссылки на внешние ключи) другим?

Внешний поставщик предоставил мне дамп данных из 20 + таблиц как * .csv-файлов. Их документации не хватает, поэтому мне приходится вручную просматривать файлы, чтобы узнать, какие файлы «связаны» в смысле РСУБД. Есть ли способ узнать, какие файлы имеют один и тот же шаблон строки и аккуратно распечатать его?

В настоящее время я делаю это и вручную связывая их вместе:

$> head -n 1 *.csv

Это дает мне результат вроде

 ==> EVO_ANGLE.csv <== "evo_ang_id","angle_description" ==> EVOP_IMAGE.csv <== "evop_image_id","evop_id","evo_ang_id","evo_collection","file_format","image_name","image_path", "image_type" ==> IMAGE_TYPE.csv <== "id","image_type","group","description" 

Как вы можете видеть, файлы EVO_ANGLE и EVOP_IMAGE связаны через evo_ang_id а EVOP_IMAGE и IMAGE_TYPE имеют image_type .

Есть ли лучший способ для меня распечатать эту информацию: где для каждого файла я могу видеть, какие другие файлы имеют поле?

Мой лучший треск в этом заключается в написании сценария оболочки, который выполняет следующие действия:

  1. Получить первую строку каждого файла и сохранить на карте в массиве
  2. Для каждого слова в каждой строке найдите, где в массиве появляется
  3. Распечатайте результат после сопоставления этой информации.

Это сложная задача, и для ее правильной работы потребуется довольно много отладки, и результат консоли может быть быстрее. Есть ли способ лучше? Любые трюки с combo / join / grep combo?

2 Solutions collect form web for “Как я могу найти, какие csv-файлы связаны (т. Е. Имеют ссылки на внешние ключи) другим?”

Если вы ищете, к какому файлу принадлежит определенный атрибут, вы можете использовать awk .

При условии, что ваши файлы csv выглядят так:

 $ for i in *.csv; do echo $i; head -n1 $i; echo; done EVO_ANGLE.csv "evo_ang_id","angle_description" EVOP_IMAGE.csv "evop_image_id","evop_id","evo_ang_id","evo_collection","file_format","image_name","image_path", "image_type" IMAGE_TYPE.csv "id","image_type","group","description" 

Следующая команда awk изменит атрибуты и имя файла:

 $ awk -F', *' ' # field separator = comma and optional spaces FNR==1{ # Parse only the first line of each file. for(i=1;i<=NF;i++) # Loop through all fields, and store them a[$i]=a[$i] " " FILENAME # in an array together with the filename. } END{ # When all files parsed, for(i in a) print i,a[i] # print the content of the array }' *.csv "image_name" EVOP_IMAGE.csv "evo_collection" EVOP_IMAGE.csv "image_path" EVOP_IMAGE.csv "file_format" EVOP_IMAGE.csv "image_type" EVOP_IMAGE.csv IMAGE_TYPE.csv "evop_id" EVOP_IMAGE.csv "evop_image_id" EVOP_IMAGE.csv "id" IMAGE_TYPE.csv "evo_ang_id" EVO_ANGLE.csv EVOP_IMAGE.csv "description" IMAGE_TYPE.csv "group" IMAGE_TYPE.csv "angle_description" EVO_ANGLE.csv 

Если вам нужно отфильтровать атрибуты, принадлежащие нескольким файлам, просто используйте следующее:

 $ awk -F', *' 'FNR==1{for(i=1;i<=NF;i++) a[$i]=a[$i] " " FILENAME}END{for(i in a) print i,a[i]}' *.csv | awk 'NF>2' "image_type" EVOP_IMAGE.csv IMAGE_TYPE.csv "evo_ang_id" EVO_ANGLE.csv EVOP_IMAGE.csv 

Вот базовая версия; выглядит очень похоже на awk версии oliv

 unset fileheads fields declare -A fileheads declare -A fields for f in *.csv do IFS=, fileheads[$f]=$(head -n1 "$f"); set -f for field in ${fileheads[$f]} do fields[$field]+=x done set +f done for field in ${!fields[*]} do [[ ${#fields[$field]} -gt 1 ]] || continue for file in ${!fileheads[*]} do [[ ${fileheads[$file]} =~ $field ]] && echo "$file has $field" done echo done 

Это собирает поля (строка 1) каждого файла в ассоциативный массив файловых fileheads , индексируется по имени файла. Он также собирает список того, сколько раз это имя каждого поля. Мы предполагаем здесь, что запятые не появляются в самих именах полей.

Затем мы перебираем все известные поля; если какой-либо из них был замечен более одного раза, мы fileheads файлы (индексы в массиве fileheads ), чтобы увидеть, содержит ли какое-либо из них это поле. По меньшей мере два файла должны соответствовать этим критериям; их имена файлов и связанное поле выходят за пределы, а затем пустая строка для удобства чтения.

Пример прогона:

вход

 $ head -n1 *.csv ==> EVOP_IMAGE.csv <== "evop_image_id","evop_id","evo_ang_id","evo_collection","file_format","image_name","image_path","image_type" ==> EVO_ANGLE.csv <== "evo_ang_id","angle_description" ==> IMAGE_TYPE.csv <== "id","image_type","group","description" 

вывод

 EVOP_IMAGE.csv has "evo_ang_id" EVO_ANGLE.csv has "evo_ang_id" EVOP_IMAGE.csv has "image_type" IMAGE_TYPE.csv has "image_type" 
  • Загрузка с оболочки на HTTP-сервер
  • Как «rpm -i» пакет, только если более старая версия не существует?
  • Использовать конфигурационный файл для моего сценария оболочки
  • Прослушивание пользовательского ввода без ожидания выполнения других процессов
  • shellcheck советует не использовать basename: почему?
  • Как эхо-строку с несколькими пробелами в bash «нетронутой»?
  • Обход фрагмента nawk, если входной файл пуст
  • Почему в папку рабочего стола не загружается «sudo bash && cd desktop»?
  • Рекурсивная функция не работает
  • bash set -o errexit проблема или способ увеличения переменной?
  • Как переименовать несколько файлов с помощью сценария оболочки?
  • Как удалить строку на основе Delimeter в perl / Shell?
  • Interesting Posts

    Можно ли конвертировать RHEL в CentOS?

    Как перенаправить удаленный рабочий стол через интерфейсы с помощью ufw?

    Xorg.bin использует 100% процессор в случайном порядке (в основном после переключения TTY), с i915

    Вчера я совершил ошибку, которая случайно удалила 1800 ГБ моего Файлового сервера

    Работа PATH с относительными каталогами

    Цвета не отображаются правильно в oh-my-zsh-темах

    Редактирование файла .profile для доступа

    каково расположение пользовательских команд

    Как использовать capsh: я пытаюсь запустить непривилегированный пинг с минимальными возможностями

    mplayer2 играет картинки из mp3

    Ошибка синтаксиса в команде if / else

    Как выводить только столбец с постоянными соседями?

    Может ли ALSA выводить звук с входной линии гнезда материнской платы на HDMI?

    Использование заголовков ядра реального времени для компиляции кода пользовательского пространства и заголовков по умолчанию

    причина добавления разрешений на выполнение сценария оболочки

    Linux и Unix - лучшая ОС в мире.