Estou tentando escrever um script de shell curto para percorrer uma lista (fornecida por um determinado comando que executo) linha por linha e enviar valores para o arquivo CSV
lista por exemplo:
aaa bbb ccc ddd eee fff
jjj kkk lll mmm nnn ooo
uuu vvv www xxx yyy zzz
Preciso fazer um loop através disso e, para cada linha, transformar o primeiro, o quarto e o sexto campos em variáveis para que eu possa fazer alguma manipulação neles.
#!/bin/sh
#
CSVfile="/tmp/`hostname`.csv"
filter=$( command )
touch $CSVfile
#
for i in $filter
do
first=$( printf "$i" | awk {'print$1'})
fourth=$( printf "$i" | awk {'print$4'})
sixth=$( printf "$i" | awk {'print$6'})
cmd=$( cat /home/app/$first/$fourth/out | grep value | awk -F: {'print$2'})
echo `date +%d%m%Y,%H%M%S`,"$sixth","$cmd" >> $CSVfile
done
O problema aqui é que o loop for vai campo por campo e não linha por linha. preciso que cada linha entre em $i para que eu possa analisá-la com "awk"
Responder1
Esse problema foi resolvido usando o loop while com IFS. Saída do comando armazenada na variável ($filter) e lida linha por linha pelo loop. Não consegui encontrar uma maneira de enviar o comando diretamente para o loop sem variável (acredito que isso não é suportado apenas pelo shell bash)
#!/bin/sh
#
CSVfile="/tmp/`hostname`.csv"
filter=$( command )
touch $CSVfile
#
while IFS= read -r line
do
first=$( printf "$i" | awk {'print$1'})
fourth=$( printf "$i" | awk {'print$4'})
sixth=$( printf "$i" | awk {'print$6'})
cmd=$( cat /home/app/$first/$fourth/out | grep value | awk -F: {'print$2'})
echo `date +%d%m%Y,%H%M%S`,"$sixth","$cmd" >> $CSVfile
done < $filter