variable separador print filtrar externas campos shell awk

shell - separador - linux awk print



¿Cómo imprimir todas las columnas después de un número en particular usando awk? (10)

En shell, busco awk cuando necesito una columna en particular.

Esto imprime la columna 9, por ejemplo:

... | awk ''{print $9}''

¿Cómo puedo decirle a awk que imprima todas las columnas que incluyen y después de la columna 9 , no solo la columna 9?


Aquí hay un ejemplo de salida ls -l :

-rwxr-----@ 1 ricky.john 1493847943 5610048 Apr 16 14:09 00-Welcome.mp4 -rwxr-----@ 1 ricky.john 1493847943 27862521 Apr 16 14:09 01-Hello World.mp4 -rwxr-----@ 1 ricky.john 1493847943 21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4 -rwxr-----@ 1 ricky.john 1493847943 10627144 Apr 16 14:09 03-Where to Get Help.mp4

Mi solución para imprimir cualquier cosa después de $9 es awk ''{print substr($0, 61, 50)}''


Cuando quiera hacer una variedad de campos, awk realmente no tiene una manera directa de hacerlo. Yo recomendaría cut lugar:

cut -d'' '' -f 9- ./infile

Editar

Se ha agregado un delimitador de campo espacial debido a que el valor predeterminado es una pestaña. Gracias a Glenn por señalar esto


Generalmente perl reemplaza awk / sed / grep et. al., y es mucho más portátil (además de ser una mejor navaja).

perl -lane ''print "@F[8..$#F]"''

Timtowtdi se aplica, por supuesto.


Para mostrar los primeros 3 campos e imprimir los campos restantes, puede usar:

awk ''{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}'' filename

donde $ 1 $ 2 $ 3 son los primeros 3 campos.


awk ''{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }''


awk ''{print substr($0, index($0,$9))}''


awk -v m="/x01" -v N="3" ''{$N=m$N ;print substr($0, index($0,m)+1)}''

Esto corta lo que está antes del campo dado nr., N, e imprime todo el resto de la línea, incluido el campo nr.N y manteniendo el espaciado original (no reformatea). No importa si la cadena del campo aparece también en algún otro lugar de la línea, que es el problema con la respuesta de Ascherer.

Definir una función:

fromField () { awk -v m="/x01" -v N="$1" ''{$N=m$N; print substr($0,index($0,m)+1)}'' }

Y úsalo así:

$ echo " bat bi iru lau bost " | fromField 3 iru lau bost $ echo " bat bi iru lau bost " | fromField 2 bi iru lau bost

La salida mantiene todo, incluso los espacios finales Para N = 0 devuelve toda la línea, como está, y para n> NF la cadena vacía


function print_fields(field_num1, field_num2){ input_line = $0 j = 1; for (i=field_num1; i <= field_num2; i++){ $(j++) = $(i); } NF = field_num2 - field_num1 + 1; print $0 $0 = input_line }


ruby -lane ''print $F[3..-1].join(" ")'' file


sed -re ''s,/s+, ,g'' | cut -d '' '' -f 9-

En lugar de ocuparse de espacios en blanco de ancho variable, reemplace todos los espacios en blanco como un espacio individual. Luego use cut simple con los campos de interés.

No usa awk, por lo que no es pertinente, pero parece apropiado dadas las otras respuestas / comentarios.