En la cáscara, canalizo a 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, incluida y después de la columna 9 , no solo la columna 9?
Respuestas:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
fuente
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
operl
para esto. Use esto solo si realmente insiste en tenerloawk
.Cuando desea hacer una variedad de campos,
awk
realmente no tiene una forma sencilla de hacerlo. En sucut
lugar recomendaría :cut -d' ' -f 9- ./infile
Editar
Se agregó un delimitador de campo de espacio debido a que el valor predeterminado es una pestaña. Gracias a Glenn por señalar esto.
fuente
find . | xargs ls -l | cut -d' ' -f 9-
. Por alguna razón, los espacios dobles también se cuentan. Ejemplo:lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
resultará en./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
Editar : Tenga en cuenta que esto no funciona si algún campo antes del noveno contiene el mismo valor que el noveno.
fuente
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
En lugar de tratar con espacios en blanco de ancho variable, reemplace todos los espacios en blanco como un solo espacio. Luego use simple
cut
con los campos de interés.No usa awk, por lo que no es pertinente, pero parecía apropiado dadas las otras respuestas / comentarios.
fuente
ps faux |
uso. Nunca tenga miedo de admitir que la herramienta XYZ no es la más adecuada.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.
fuente
-l
o agregar\n
a la declaración de impresión.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 se 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.
Defina una función:
fromField () { awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}' }
Y utilícelo 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, incluidos los espacios finales. Para N = 0, devuelve la línea completa, tal cual, y para n> NF la cadena vacía
fuente
Aquí hay un ejemplo de
ls -l
salida:Mi solución para imprimir cualquier publicación
$9
esawk '{print substr($0, 61, 50)}'
fuente
ruby -lane 'print $F[3..-1].join(" ")' file
fuente
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.
fuente
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 }
fuente
Usar cortar en lugar de awk y superar los problemas de averiguar en qué columna comenzar mediante el comando -c de corte de caracteres.
Aquí estoy diciendo, dame todos menos los primeros 49 caracteres de la salida.
Al
/*/*/
final del comando ls dice muéstrame lo que hay en los subdirectorios también.También puede extraer ciertos rangos de caracteres ala (de la página de manual de corte). Por ejemplo, muestre los nombres y las horas de inicio de sesión de los usuarios que han iniciado sesión actualmente:
fuente