7 votos

¿Cómo puedo imprimir el pasado 5 de campos en awk?

Tengo 10 campos y quiero volver a empezar desde el campo 5 campo a 10 y de ignorar los 5 primeros campos. ¿Cómo puedo utilizar NF en awk para hacer eso?

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

Quiero mostrar sólo:

f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

8voto

Serg Puntos 17677

Usted necesita un bucle a través de los campos:

bash-4.3$ awk '{for(i=6;i<=NF;i++) printf $i" "; print ""}' input_file.txt 
f6 f7 f8 f9 f10 
c6 c7 c8 c9 c10 

O usted puede hacer campos de igual a Null string:

bash-4.3$ awk '{for(i=1;i<=5;i++) $i="";print}' input_file.txt 
     f6 f7 f8 f9 f10
     c6 c7 c8 c9 c10

O el uso de la subcadena de toda la línea , para imprimir todos los caracteres desde donde campo 6 comienza (el crédito http://stackoverflow.com/a/12900372/3701431):

bash-4.3$ awk '{print substr($0,index($0,$6))}' input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

o simplemente utilizar cut comando:

bash-4.3$ cut -d " " -f6-10  input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Python también puede hacer eso:

bash-4.3$ python -c 'import sys;fields=[" ".join(line.strip().split()[5:]) for line in sys.stdin];print "\n".join(fields)' < input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

o, alternativamente:

$ python -c "import sys;print '\n'.join(map(lambda x:' '.join(x.split()[5:]),sys.stdin.readlines()))" < input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

O con Ruby:

bash-4.3$ ruby -ne 'print $_.split()[5..10].join(" ");print "\n"' < input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Bash + xargs puede hacerlo también, aunque es un poco más complicado:

bash-4.3$ cat input_file.txt | xargs -L 1 bash -c 'arr=($@);for i in $(seq 5 10);do printf "%s " ${arr[$i]} ; done; echo' sh
f6 f7 f8 f9 f10  
c6 c7 c8 c9 c10 

5voto

linuxmaniax Puntos 11

Sólo el proceso de los campos de interés. Que va a ser el último campo -4, el último campo -3, hasta que el último campo.

Lectura de un archivo con este contenido (file.txt):

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

Ejecutar awk en el archivo como se describe a continuación. La línea con el $ signo es el comando. Las últimas dos líneas de la salida.

$ awk '{print $(NF-4)" "$(NF-3)" "$(NF-2)" "$(NF-1)" "$NF}' file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Nota: Como se ha señalado por Ciro en el comentario, he quitado el script de bash y a la izquierda justo la instrucción print para hacer más simple y más rápido.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: