Eu usei
#!/bin/bash
input_file=${1}
declare -A columns
SEP='\t'
curr_level=0
headers=""
while read line; do
if [ -n "${column}" ]; then
for (( i=${curr_level}; i<${columns[$column]}; i++ )); do
echo -ne ${SEP} >> tmpout.txt
done
curr_level=${columns[$column]}
echo -n ${line} >> tmpout.txt
column=""
else
column="${line}"
if [ -z "${columns[$line]}" ]; then
columns[$line]="${#columns[@]}"
headers+="${line}${SEP}"
elif [ ${columns[$line]} -le $curr_level ]; then
echo "" >> tmpout.txt
curr_level=0
fi
fi
done < $input_file
echo -e $headers | cat - tmpout.txt >> out.txt
unset columns column headers
rm tmpout.txt
Coloque isso em um arquivo, digamos script.sh, torne-o executável e chame script.sh file_to_format.sh
. Ele criará um arquivo chamado out.txt
, contendo o resultado, e um arquivo chamado tmpout.txt
, que será excluído, será usado para o trabalho temporário.
Observação: isso deixará lacunas verticais, como
AAA BBB CCC
999888 1111
2222
999777 3333
999666 4444 Doit