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.