Podemos combinar todos os comandos do pipeline original columns=
shell em um script sed
. Este script sed
modifica apenas a primeira linha da entrada e, em seguida, sai. O que segue é exatamente a mesma coisa que o columns=
na pergunta original:
columns=$(
sed '
1 { # execute block on line 1
s/-/_/g
s/ /_/g
s/COL[0-9]\+_BDID/DROP_BDID/g
s/COL[0-9]\+_//g
s/\t/\n/g
y/abcdefghijklmnopqrstuv/ABCDEFGHIJKLMNOPQRSTUV/
q # quit after line 1
}
' "$1"
)
# . . .
Eu prefiro o formato de várias linhas também para legibilidade. Mesmo que a declaração original estivesse em uma linha, era muito menos eficiente e, na minha opinião, mais difícil de ler. yomd
Agora você tem os cabeçalhos do arquivo de entrada (arg 1), armazenados na variável columns
separados por novas linhas. Você pode iterar sobre as strings em $columns
com um for
loop, isso separará os nomes das colunas em cut_cols
por novas linhas:
cut_cols="$(
for col in $columns
do
case $col in
(*__LINE_NUMBER*|*CONFIDENCE*|*DROP_BDID*|*LINE_NUMBER*|*ZIP9*|*ZIP9MATCH*)
echo "$col"
;;
esac
done
)"
Dependendo das suas preferências, isso faz o mesmo:
cut_cols=
for col in $columns
do
case $col in
(*__LINE_NUMBER*|*CONFIDENCE*|*DROP_BDID*|*LINE_NUMBER*|*ZIP9*|*ZIP9MATCH*)
cut_cols="$cut_cols $col"
;;
esac
done
cut_cols=$(echo "$cut_cols" | sed 's/^ *//; s/ /\n/g')
Eu não testei o loop de sua matriz para cut_cols
porque não uso matrizes de shell. O método acima de iterar sobre $columns
é o método mais universal e tradicional. Array
s é uma extensão, não disponível em todos os shell.
Depois de ter atribuído a cut_cols
, você pode iterar o mesmo que $columns
.
Para enviar um novo cabeçalho com os dados do arquivo original, imprima o novo cabeçalho e imprima todos, exceto a primeira linha do arquivo original. Faça isso em um grupo de comandos (entre {
e }
) para que você possa redirecionar a saída de ambos os comandos como se fossem um único programa.
O texto a seguir produz o arquivo de texto original completo sem a linha de cabeçalho original e com o que você criou, e o envia ao stdin
de vsql
:
# . . .
{ # start command group
echo "$columns" | tr '\n' '\t'; # print with tabs instead of newlines
echo # add newline record separator
sed 1d "$1" # print all but 1st line of "$1"
} | # pipe as one file to vsql
/opt/vertica/bin/vsql -U ${4} -w ${5} -h ${database} \
-c "copy $schema.$table from STDIN delimiter E'\t' direct no escape;"