El corte puede tomar varios rangos en -f
:
Columnas hasta 4 y de 7 en adelante:
cut -f -4,7-
o para los campos 1,2,5,6 y del 10 en adelante:
cut -f 1,2,5,6,10-
etc.
La primera parte de tu pregunta es fácil. Como ya se señaló, cut acepta la omisión del índice inicial o final de un rango de columna, interpretando esto como que significa "desde el inicio hasta la columna n (inclusive)” o “de la columna n (inclusive) hasta el final”, respectivamente:
$ printf 'this:is:a:test' | cut -d: -f-2
this:is
$ printf 'this:is:a:test' | cut -d: -f3-
a:test
También admite combinación rangos Si desea, por ejemplo, las primeras 3 y las últimas 2 columnas en una fila de 7 columnas:
$ printf 'foo:bar:baz:qux:quz:quux:quuz' | cut -d: -f-3,6-
foo:bar:baz:quux:quuz
Sin embargo, la segunda parte de su pregunta puede ser un poco más complicada según el tipo de entrada que esté esperando. Si por “último n columnas” quiere decir “último n columnas (independientemente de sus índices en la fila general)” (es decir, porque no necesariamente sabe cuántas columnas encontrará de antemano), lamentablemente esto no es posible de lograr usando cut
solo. Para usar efectivamente cut
para sacar "el último n columnas” en cada línea, el número total de columnas presentes en cada línea debe conocerse de antemano, y cada línea debe ser consistente en el número de columnas que contiene.
Si no saber cuántas "columnas" pueden estar presentes en cada línea (por ejemplo, porque está trabajando con una entrada que no es estrictamente tabular), entonces tendrá que usar algo como awk
en cambio. Por ejemplo, para usar awk
para extraer las últimas 2 "columnas" (awk las llama campos, cuyo número puede variar por línea) de cada línea de entrada:
$ printf '/a\n/a/b\n/a/b/c\n/a/b/c/d\n' | awk -F/ '{print $(NF-1) FS $(NF)}'
/a
a/b
b/c
c/d
Para usar AWK para cortar el primer y el último campo:
awk '{$1 = ""; $NF = ""; print}' inputfile
Desafortunadamente, eso deja los separadores de campo, así que
aaa bbb ccc
se convierte
[space]bbb[space]
Para hacer esto usando la respuesta de kurumi que no dejará espacios adicionales, pero de una manera específica para sus requisitos:
awk '{delim = ""; for (i=2;i<=NF-1;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile
Esto también soluciona un par de problemas en esa respuesta.
Para generalizar que:
awk -v skipstart=1 -v skipend=1 '{delim = ""; for (i=skipstart+1;i<=NF-skipend;i++) {printf delim "%s", $i; delim = OFS}; printf "\n"}' inputfile
Luego puede cambiar la cantidad de campos para omitir al principio o al final cambiando las asignaciones de variables al principio del comando.
Puedes cortar usando lo siguiente,
-d:delimitador, -f para campos
\t usado para campos separados por tabulaciones
cut -d$'\t' -f 1-3,7-