Você terá que
printf "%s\n" "$str1" "$str2" | column -t
e então injetam os cabeçalhos
Geralmente, eu escrevo algo assim que usa matrizes:
strings=( "$str1" "$str2" ... )
headers=( "STRING SHORT" "STRING LONG" ... )
exec 3< <( printf "%s\n" "${strings[@]}" | column -t )
for (( i=0; i<${#strings[@]}; i++)); do
printf -- "----\n%s\n----\n" "${headers[i]}"
n=$(wc -l <<< "${strings[i]}")
for (( j=1; j<=n; j++ )); do
IFS= read -r line <&3
echo "$line"
done
echo
done
exec 3<&-
Notas:
-
<( ... )
é uma substituição de processos da bash. Esse é um pipeline simples que é tratado como um nome de arquivo. É muito útil em situações em que você usaria um cano, mas não pode ter o lado direito do cano executado em uma subcamada. - aqui, estamos abrindo o descritor de arquivo nº 3 para ler os dados desse "arquivo":
exec 3<file
-
read -r line <&3
lê uma linha de dados da substituição do processo -
exec 3<&-
fecha o descritor de arquivo - leia mais sobre redirecionamentos aqui: link
- Eu poderia ter usado um
printf ... | while read line; do ...; done
, mas achei que os loops for facilitariam a contagem.