Tengo un archivo de texto dividido así:
field1,field2,field3
xield1,xield2,xield3
dield1,dield2,dield3
gield1,gield2,gield3
Cada una de estas columnas será un parámetro para un programa, y me gustaría que se llame al programa para cada línea
Esperaba un bucle, algo así como:
for $i in file
command $field2 -x $field3 -PN -$field1 >> output
done
¿Cuál sería la mejor manera de lograr algo como esto en bash?
bash
text-processing
scripting
csv
Decano
fuente
fuente

Respuestas:
Esto debería funcionar si el número de campos es constante. En lugar de
echousar tu comando.fuente
Debe usar a
whilecon elreadincorporado:Como funciona esto
cutinstrucción toma la línea y la divide en el delimitador especificado por-d.--output-delimiteres el carácter separador quecutse usará para mostrar los campos seleccionados, aquí elegimos un espacio para que podamos colocar los diferentes campos en la matrizfields.-f1-entra en juego.fields, puede acceder a cualquier campo particular que desee con la sintaxis${field[number]}dondenumberes uno menos que el número de campo real que desea, ya que la indexación de matriz está basada en cero en Bash.Nota
Para un número constante de campos
En su lugar, puede hacer algo similar a la respuesta de 1_CR :
Lo anterior, aunque parece más ruidoso, debería funcionar en cualquier shell compatible con POSIX, no solo Bash.
fuente
IFSun valor apropiado en lareadinvocaciónPuede
readdividir cada línea en una matriz,activandoIFSadecuadamente.Entonces, en el ejemplo anterior, puede acceder a cada elemento de la matriz utilizando su índice, comenzando por 0.
fuente
Este
awkone-liner hará lo que quieras:Reemplace
echocon su comando yf.txtcon el archivo que desea recorrer.Breve explicación:
-F,se establecerá,como delimitador.cmdconstruye el comando ysystem(cmd)llama al comando.fuente
GNU SED también se puede utilizar.
observe el uso de la opción e para el comando s
fuente