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