Aqui está uma rápida adaptação da solução bash para esta questão SO similar para os separadores particulares que você tem (ponto e vírgula):
declare -a array=( ) # we build a 1-D-array
IFS=';' read -a line < "$1" # read the headline
COLS=${#line[@]} # save number of columns
index=0
while IFS=';' read -a line ; do
for (( COUNTER=0; COUNTER<${#line[@]}; COUNTER++ )); do
array[$index]=${line[$COUNTER]}
((index++))
done
done < "$1"
for (( ROW = 0; ROW < COLS; ROW++ )); do
printf "%s" ${array[$ROW]}
for (( COUNTER = ROW+COLS; COUNTER < ${#array[@]}; COUNTER += COLS )); do
printf ";%s" ${array[$COUNTER]}
done
printf "\n"
done