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
echo
usar tu comando.fuente
Debe usar a
while
con elread
incorporado:Como funciona esto
cut
instrucción toma la línea y la divide en el delimitador especificado por-d
.--output-delimiter
es el carácter separador quecut
se 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]}
dondenumber
es 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
IFS
un valor apropiado en laread
invocaciónPuede
read
dividir cada línea en una matriz,
activandoIFS
adecuadamente.Entonces, en el ejemplo anterior, puede acceder a cada elemento de la matriz utilizando su índice, comenzando por 0.
fuente
Este
awk
one-liner hará lo que quieras:Reemplace
echo
con su comando yf.txt
con el archivo que desea recorrer.Breve explicación:
-F,
se establecerá,
como delimitador.cmd
construye 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