Estoy intentando escribir un breve script de shell para recorrer una lista (dada por un determinado comando que ejecuto) línea por línea y enviar valores a un archivo CSV.
lista por ejemplo:
aaa bbb ccc ddd eee fff
jjj kkk lll mmm nnn ooo
uuu vvv www xxx yyy zzz
Necesito recorrer esto y para cada línea tomar los campos 1.º, 4.º y 6.º en variables para poder manipularlos.
#!/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
El problema aquí es que el bucle for va campo por campo y no línea por línea. Necesito que cada línea entre en $i para poder analizarla con "awk"
Respuesta1
Este problema se resolvió utilizando el bucle while con IFS. Salida del comando almacenada en la variable ($filter) y leída línea por línea por el bucle. No pude encontrar una manera de enviar el comando directamente al bucle sin variable (creo que esto no es compatible con bash únicamente de shell)
#!/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