/
zztranspor.sh
87 lines (78 loc) · 2.37 KB
/
zztranspor.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# ----------------------------------------------------------------------------
# Trocar linhas e colunas de um arquivo, fazendo uma simples transposição.
# Opções:
# -d <sep> define o separador de campos na entrada.
# -D, --output-delimiter <sep> define o separador de campos na saída.
#
# O separador na entrada pode ser 1 ou mais caracteres ou uma ER.
# Se não for declarado assume-se espaços em branco como separador.
# Conforme padrão do awk, o default seria FS = "[ \t]+".
#
# Se o separador de saída não for declarado, assume o mesmo da entrada.
# Caso a entrada também não seja declarada assume-se como um espaço.
# Conforme padrão do awk, o default é OFS = " ".
#
# Se o separador da entrada é uma ER, é bom declarar o separador de saída.
#
# Uso: zztranspor [-d <sep>] [-D | --output-delimiter <sep>] <arquivo>
# Ex.: zztranspor -d ":" --output-delimiter "-" num.txt
# sed -n '2,5p' num.txt | zztranspor -d '[\t:]' -D '\t'
#
# Autor: Itamar <itamarnet (a) yahoo com br>
# Desde: 2013-09-03
# Versão: 1
# Requisitos: zzzz zztool zztrim
# Tags: arquivo, manipulação
# ----------------------------------------------------------------------------
zztranspor ()
{
zzzz -h transpor "$1" && return
local sep ofs
while test "${1#-}" != "$1"
do
case "$1" in
-d)
# Separador de campos no arquivo de entrada
sep="$2"
shift
shift
;;
-D | --output-delimiter)
# Separador de campos na saída
ofs="$2"
shift
shift
;;
*) break;;
esac
done
zztool file_stdin "$@" |
awk -v sep_awk="$sep" -v ofs_awk="$ofs" '
BEGIN {
# Definindo o separador de campo na entrada do awk
if (length(sep_awk)>0)
FS = sep_awk
# Definindo o separador de campo na saída do awk
ofs_awk = (length(ofs_awk)>0?ofs_awk:FS)
}
{
# Descobrindo a maior quantidade de campos
if (max_nf < NF)
max_nf = NF
# Criando um array indexado por número do campo e número da linha, nessa ordem
for (i = 1; i <= NF; i++)
vetor[i, NR] = $i
}
END {
# Transformando o campo em linha
for (i = 1; i <= max_nf; i++) {
# Transformando a linha em campo
for (j = 1; j <= NR; j++)
linha = sprintf("%s%s%s", linha, vetor[i, j], ofs_awk)
# Tirando o separador ao final da linha
print substr(linha, 1, length(linha) - length(ofs_awk))
# Limpando a variável para a próxima iteração
linha=""
}
}' | zztrim -r
}