GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo cortar las primeras n y las últimas n columnas?

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-

Linux
  1. Cómo usar expresiones Awk y regulares para filtrar texto o cadenas en archivos

  2. Trabajar con columnas:¿Awk y Sed?

  3. Corte/Grep Y Df -h?

  4. Cómo:replicación y configuración de DRBD

  5. ¿Cómo imprimir la tercera columna en la última columna?

Cómo Cortar, Copiar y Pegar en Vim/Vi

Cómo copiar, cortar y pegar en Vim / Vi

Cómo instalar y configurar SeedDMS

Cómo eliminar líneas vacías en archivos usando Grep, Sed y Awk

Cómo encontrar el último inicio de sesión en Linux

Cómo instalar y configurar Grafana