2011-09-26 50 views

Respuesta

11

Puede bucle sobre todas las columnas y filtrar los que no quieren:

awk '{for (i=1; i<=NF; i++) if (i<3 || i>29) printf $i " "; print""}' input.txt 

donde el NF le da el número total de campos de un registro.
Para cada columna que cumpla la condición imprimimos la columna seguida de un espacio " ".


EDIT: actualizado después de la observación de johnny:

awk -F 'FS' 'BEGIN{FS="\t"}{for (i=1; i<=NF-1; i++) if(i<3 || i>5) {printf $i FS};{print $NF}}' input.txt 

esto se mejoró en 2 formas:

  • mantiene los separadores originales
  • no añade un separador al final
+0

No debería imprime una pestaña (\ t) en lugar de un espacio. Quiere eliminar campos, quizás no eliminar pestañas al mismo tiempo (si lo entiendo correctamente). – johnny

+0

@johnny: tienes razón. Actualicé el código por lo que debería considerar el separador correctamente. – oliver

41

Esta es lo que el comando es para cut:

cut -f1,2,30- inputfile 

El valor predeterminado es pestaña. Puede cambiar eso con el interruptor -d.

+0

Tuve que eliminar el último '-' para hacerlo funcionar en Ubuntu. Si lo dejo, 'corte' imprimirá todas las columnas. ¿Alguien tenía este problema también? –

+0

Debe imprimir las columnas una, dos y treinta hasta la última (60 en la pregunta). ¡Si no es un error en Ubuntu! –

+0

Aaaah, de acuerdo. Cometí un error. Mi error. –

1
awk '{for(z=3;z<=15;z++)$z="";$0=$0;$1=$1}1' 

entrada

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 

salida

c1 c2 c16 c17 c18 c19 c20 c21 
+0

Esto no elimina columnas. Los pone en blanco y los reimprime ... con el 'O * FS' especificado de OP de' \ t' reemplazado por un espacio único, que no pidieron. La eliminación _apparent_ es casual y necesita 'FS' y' OFS' para ser el '' s + 'predeterminado. Un separador bastante inútil e incompatible con '\ t' de OP, a menos que su archivo coincidentemente no pueda tener campos vacíos, ya que los aplastaría en filas irregulares. Cualquier otro separador, p. OP '\ t', da salida que todavía tiene las columnas no deseadas, pero ahora está vacía. Y '$ 0 = $ 0' es redundante y puede ser un desperdicio. El método documentado para reconstruir un registro es '$ 1 = $ 1' –

0

Perl solución 'de empalme' que no añade iniciales o finales espacios en blanco:

perl -lane 'splice @F,3,27; print join " ",@F' file 

Produce salida:

c1 c2 c30 c31 
Cuestiones relacionadas