¿Es posible imprimir una variedad iterada de argumentos a través de cli desde un csv? (ver ejemplo)

¿Es posible imprimir una variedad iterada de argumentos a través de cli desde un csv? (ver ejemplo)

Tengo cientos de registros repartidos en unos pocos miles de máquinas virtuales y estoy intentando crear algunos scripts para escanear rápidamente los registros. He descubierto la mayor parte de la presentación y quería saber si hay una manera fácil de usar algo como awk. printf, etc., que sé cómo usar, pero específicamente para imprimir un rango iterado de valores de los archivos de registro.

Ejemplo:

awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.

Sé cómo modificar, formatear, separar, etc. correctamente la salida impresa, pero pensé que sería bueno si pudiera especificar un rango de campos que me gustaría que se imprimiera.

Actualizaré mi pregunta si descubro cómo hacerlo con las preguntas similares sugeridas y/o por mi cuenta.

¡Gracias!

EDITAR: Sé cómo imprimir $1 $2 $3 manualmente pero no lo incluí en mi ejemplo

EDITAR 2: También sé cómo contar la cantidad de campos con awk usando NF para hacer que el rango sea dinámico más adelante, que es mi objetivo a largo plazo.

Respuesta1

Rangos que comienzan con el primer campo.

Consideremos este archivo de prueba:

$ cat input.csv
a,b,c,d,e,f,g,h,i,j

Al menos con GNU awk, podemos imprimir los primeros cinco (u otro número) de campos como este:

$ awk -F, '{NF=5; print}' OFS=, input.csv
a,b,c,d,e

Para aquellos que valoran la concisión sobre la claridad, podríamos escribir de manera equivalente:

$ awk -F, '{NF=5;} 1' OFS=, input.csv
a,b,c,d,e

Cambio de tamaño dinámico

Para omitir los últimos 2 campos, independientemente de cuántos campos precedan a esos dos:

$ awk -F, '{NF-=2; print}' OFS=, input.csv
a,b,c,d,e,f,g,h

Otras gamas

Para imprimir comenzando y finalizando con campos arbitrarios, se necesita un bucle:

$ awk -v first=3 -v last=6 -F, '{for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f

Para imprimir desde el tercer campo y dejar de lado dinámicamente los dos últimos campos:

$ awk -v first=3 -F, '{last=NF-2; for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f,g,h

Respuesta2

Sólo un breve comentario; awkes mucho más flexible, pero si lo único que desea es un rango particular de campos, use cut:

cut -d, -f1-5 huge_log_file.csv

Esto es mucho más simple que un awkbucle si eso es todo lo que necesitas.

información relacionada