Cómo separar campos con espacio o tabulación en awk

53

Mientras jugaba con awkvine a ejecutar:

ls -la >> a.txt ; awk {'print $5  $1'} a.txt ;

Esto está dando salida como:

53277-rw-------
52347-rw-------

¿Cómo puedo obtener un espacio entre estos dos amigos de salida?

rɑːdʒɑ
fuente
1
Como consejo, no debe analizar la salida de ls. Esto te morderá en la espalda tarde o temprano.
gniourf_gniourf
En awk, para concatenar dos cadenas, sólo los coloca de lado a lado -print $5 $1
Glenn Jackman
2
@kenorb y votantes cercanos, el duplicado vinculado no es un duplicado en absoluto. Ya saben cómo imprimir campos por premisa ( awk {'print $5 $1'} a.txt). Están preguntando cómo poner un espacio entre el campo # 1 y el campo # 5.
kos

Respuestas:

73

Solo cambia la línea a

ls -la >> a.txt ; awk {'print $5 "        " $1'} a.txt ;

Esto debería imprimir la salida con espacios.

Espero que esto ayude.

Editar:

Según lo sugerido por McNisse , puede usar printf, que le proporcionaría un buen formato de salida

ls -la >> a.txt ; awk {'printf ("%5s\t%s\n", $5, $1)'} a.txt ;
devav2
fuente
44
La printffunción proporciona un mejor control, especialmente si desea formatear números. printf("%s\t%s\n", $5, $1)
McNisse
1
¿Hay un error tipográfico en la respuesta anterior? qué 5ssignifica enawk {'printf ("%5s\t%s\n", $5, $1)'}
Vishal
67

Otra técnica específica de awk, usa el "separador de campo de salida"

ls -la | awk -v OFS='\t' '{print $5, $1}'

La coma es crucial aquí.

Glenn Jackman
fuente
esto funciona pero causa $1ir a nueva línea
loretoparisi
9

Una forma sencilla de obtener pestañas es:

awk {'print $5"\t"$1'}
llamar
fuente
6

Sé que este es un hilo viejo, pero estoy aprendiendo y encontré útiles estas publicaciones. Mi mejor solución fue usar gawk para insertar espacios entre las variables para usted.

ls -la | gawk '{print $1, $9}'
codeJediNinjaDork
fuente
3
-1: nada nuevo. gawk, mawko cualquier otro awk, todos insertan espacios si usa la coma, que es lo que dice esta respuesta .
muru
1
Debe ser ls -la | awk '{print $1, $9}'. Como dijo muru, gawkno es necesario.
Nick Crawford
1

Para colocar el espacio entre los argumentos, simplemente agregue " ", por ejemplo awk {'print $5" "$1'}.

Sin embargo, no se recomienda analizar la salida del lscomando , ya que no es confiable y la salida es para humanos, no para scripts. Por lo tanto, use comandos alternativos como findo stat.

Aquí hay un ejemplo usando GNU stat:

$ stat -t *
001.txt 23 8 81a4 501 20 1000004 242236402 1 0 0 1460260387 1460260239 1460260239 1460260194 4096
7c1c.txt 21 8 81a4 501 20 1000004 242236595 1 0 0 1460261322 1460260486 1460260486 1460260486 4096

que imprimirá una salida amigable para la máquina (en forma concisa), para que pueda obtener exactamente lo que necesita. Luego, use -cpara usar un formato específico, o use awk, cuto readpara obtener las columnas correctas.

Consulte stat --helppara más opciones. Por ejemplo, para imprimir el día de la modificación, consulte este ejemplo .

kenorb
fuente
Parece que el OP está tratando de analizar la salida para fines de lectura humana y no para ejecutar un script (como for i in ls; do $i).
mchid