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

Гораздо более читаемый способ сделать это с помощью оператора case :

move=''
while [[ -z "$move" ]]; do
   echo "Please specify paper, scissors, or rock.  >"
   read userinput
   case "$userinput" in
      [Rr]*)
         move="rock"
         ;;
      [Pp]*)
         move="paper"
         ;;
      [Ss]*)
         move="scissors"
         ;;
      *)
         echo "Invalid input."
         ;;
   esac
done

Вы можете сделать что-то подобное с ходом вашего случайно выбранного компьютерного игрока и для определения результата.

3
24.02.2017, 01:45
2 ответа

Если вы ищете, к какому файлу принадлежит определенный атрибут, вы можете использовать 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
1
27.01.2020, 21:25

Вот версия, ориентированная на bash; выглядит очень похоже на версию 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 ), чтобы увидеть, содержит ли какой-либо из них это поле. По крайней мере два файла должны соответствовать этому критерию; их имена файлов и связанное поле выводятся эхом, за ними следует пустая строка для удобства чтения.

Пример выполнения:

вход

$ 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"
1
27.01.2020, 21:25

Теги

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