Как я могу найти, какие 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?

  • Сменить пароль в режиме без звука
  • Вход в систему с конкретной оболочкой при входе в терминал
  • Несколько аргументов параметра, использующих getopts в bash
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Проверьте, начинаются ли две строки с одним и тем же символом, если это означает, что среднее выходное значение, если нет, выводит фактическое значение
  • / bin / dash: проверьте, является ли $ 1 числом
  • Возврат части строки, соответствующей шаблону
  • Сценарий оболочки для изменения оболочки пользователя
  • 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" 
    Linux и Unix - лучшая ОС в мире.