Почему awk
и sed
, когда bash с coreutils достаточно:
# Sorry my cat. Using `cat` as input pipe
cat <<EOF |
name,list_of_subjects,list_of_sports,school
Eg1: john,science\,social,football,florence_school
Eg2: james,painting,tennis\,ping_pong\,chess,highmount_school
EOF
# remove first line!
tail -n+2 |
# substitute `\,` by an unreadable character:
sed 's/\\\,/\xff/g' |
# read the comma separated list
while IFS=, read -r name list_of_subjects list_of_sports school; do
# read the \xff separated list into an array
IFS=$'\xff' read -r -d '' -a list_of_subjects < <(printf "%s" "$list_of_subjects")
# read the \xff separated list into an array
IFS=$'\xff' read -r -d '' -a list_of_sports < <(printf "%s" "$list_of_sports")
echo "list_of_subjects : ${list_of_subjects[@]}"
echo "list_of_sports : ${list_of_sports[@]}"
done
выдаст:
list_of_subjects : science social
list_of_sports : football
list_of_subjects : painting
list_of_sports : tennis ping_pong chess
Обратите внимание, что это, скорее всего, будет медленнее, чем решениеиспользуя awk
.
Обратите внимание, что принцип действия такой же, как и в других ответах - замените строку \,
другим уникальным символом, а затем используйте этот символ для итерации по второму и третьему элементам поля.