Las opciones 1 a 3 tienen problemas con varios espacios en blanco (pero son simples). Esa es la razón para desarrollar las opciones 4 y 5, que procesan múltiples espacios en blanco sin problemas. Por supuesto, si se utilizan las opciones 4 o 5 con n=0
ambas, se conservarán los espacios en blanco iniciales, lo que n=0
significa que no habrá división.
Opción 1
Una solución de corte simple (funciona con delimitadores simples):
$ echo '1 2 3 4 5 6 7 8' | cut -d' ' -f4-
4 5 6 7 8
opcion 2
Forzar una recalculación de awk a veces resuelve el problema (funciona con algunas versiones de awk) de espacios iniciales agregados:
$ echo '1 2 3 4 5 6 7 8' | awk '{ $1=$2=$3="";$0=$0;} NF=NF'
4 5 6 7 8
Opción 3
Imprimir cada campo formateado con printf
le dará más control:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for (i=n+1; i<=NF; i++){printf("%s%s",$i,i==NF?RS:OFS);} }'
4 5 6 7 8
Sin embargo, todas las respuestas anteriores cambian todos los FS entre campos a OFS. Construyamos un par de soluciones para eso.
Opción 4
Un bucle con sub para eliminar campos y delimitadores es más portátil y no activa un cambio de FS a OFS:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for(i=1;i<=n;i++) { sub("^["FS"]*[^"FS"]+["FS"]+","",$0);} } 1 '
4 5 6 7 8
NOTA: El "^ [" FS "] *" es para aceptar una entrada con espacios iniciales.
Opcion 5
Es muy posible construir una solución que no agregue espacios en blanco adicionales al principio o al final, y preservar los espacios en blanco existentes usando la función gensub
de GNU awk, como esta:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }'
4 5 6 7 8
También se puede usar para intercambiar una lista de campos dado un recuento n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ a=gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1);
b=gensub("^(.*)("a")","\\1",1);
print "|"a"|","!"b"!";
}'
|4 5 6 7 8 | ! 1 2 3 !
Por supuesto, en tal caso, el OFS se utiliza para separar ambas partes de la línea y el espacio en blanco final de los campos aún se imprime.
Nota 1: ["FS"]*
se utiliza para permitir espacios iniciales en la línea de entrada.
cut -f3-
?