2010-06-15 10 views
11

tengo el siguiente archivo y tengo que imprimir todo excepto $1 y $2 por awk

del archivo:

INFORMATION DATA 12 33 55 33 66 43 
INFORMATION DATA 45 76 44 66 77 33 
INFORMATION DATA 77 83 56 77 88 22 
... 

lo deseable salida:

12 33 55 33 66 43 
45 76 44 66 77 33 
77 83 56 77 88 22 
... 
+0

posible duplicado de [Uso de awk para imprimir todas las columnas desde la enésima hasta la última] (http: // stackoverflow.com/questions/2961635/using-awk-to-print-all-columns-from-the-nth-to-the-last) – Andy

Respuesta

11
$ cat t 
INFORMATION DATA 12 33 55 33 66 43 
INFORMATION DATA 45 76 44 66 77 33 
INFORMATION DATA 77 83 56 77 88 22 

$ awk '{for (i = 3; i <= NF; i++) printf $i " "; print ""}' t 
12 33 55 33 66 43 
45 76 44 66 77 33 
77 83 56 77 88 22 
+2

Incluso si para la pregunta actual es más simple que awk (ver a continuación), si tiene para hacer algunos cálculos sobre sus datos, ¡entonces es muy útil saber su ciclo! Un colega mío tuvo que realizar adiciones en las dos primeras columnas y luego imprimir las otras como están: un simple bloque printf seguido de tu bloque hizo el truco. Gracias por la respuesta (que me dio más :-)). –

18

Bueno, dada su de datos, de corte debe ser suficiente:

cut -d\ -f3- infile 
3

danbens respuesta deja un espacio en blanco al final de la cadena resultante. por lo que la forma correcta de hacerlo sería:

awk '{for (i=3; i<NF; i++) printf $i " "; print $NF}' filename 
+0

buena atención al detalle ... +1 para eso :) –

+1

awk '{for (i = 3; i

0

Aquí hay otra solución awk, eso es más flexible que el cut uno y es más corta que las otras awk queridos. Asumiendo que su separadores son espacios individuales (modificar la expresión regular como sea necesario si no lo son):

awk --posix '{sub(/([^ ]*){2}/, ""); print}' 
9

A pesar de que agrega un espacio adicional al comienzo de cada línea en comparación con la producción esperada de Yael, aquí hay una awk más corto y más sencillo solución basada en que los anteriormente sugeridos:

awk '{$1=$2=""; print}' 

o incluso:

awk '{$1=$2=""}1' 
+1

¡gran solución! – inselberg

+1

Si quiere evitar los espacios iniciales, puede hacer 'awk '{$ 1 = $ 2 =" "; $ 0 = $ 0; $ 1 = $ 1} 1' archivo ' – user000001

1

Si las dos primeras palabras no cambian, probablemente, lo más sencillo sería:

awk -F 'INFORMATION DATA ' '{print $2}' t 
0

Si Perl es una opción: se utilizan

perl -lane 'splice @F,0,2; print join " ",@F' file 

Estas opciones de línea de comandos:
-n bucle alrededor de cada línea del archivo de entrada, no se imprimen automáticamente
-l elimina las nuevas líneas antes del procesamiento, y luego los agrega de nuevo
-a modo autosplit - divide líneas de entrada en la matriz @F. El valor predeterminado es la división en el espacio en blanco
-e ejecutar el código Perl

splice @F,0,2 elimina limpiamente columnas 0 y 1 de la matriz @F
join " ",@F se une a los elementos de la matriz @F, utilizando un espacio entre cada elemento

variación de los archivos de entrada csv:

perl -F, -lane 'splice @F,0,2; print join " ",@F' file 

Esto utiliza el separador de campo op -F con una coma

Cuestiones relacionadas