Come separare i campi con spazio o scheda in awk


53

Durante il gioco awksono venuto a eseguire:

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

Questo sta dando output come:

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

Come posso ottenere uno spazio tra questi due amici dell'output?


1
Come consiglio, non si dovrebbe analizzare l'output di ls. Questo ti morderà alla schiena prima o poi.
gniourf_gniourf,

In awk, per concatenare due stringhe, le devi solo affiancare -print $5 $1
glenn jackman,


2
@kenorb e chiudi gli elettori, il duplicato collegato non è affatto un duplicato. Sanno già come stampare i campi per premise ( awk {'print $5 $1'} a.txt). Stanno chiedendo come inserire uno spazio tra il campo # 1 e il campo # 5.
kos

Risposte:


73

Basta cambiare la linea in

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

questo dovrebbe stampare l'output con spazi.

Spero che sia di aiuto.

Modificare:

Come suggerito da McNisse puoi usare printf, che ti fornirebbe un buon formato di output

ls -la >> a.txt ; awk {'printf ("%5s\t%s\n", $5, $1)'} a.txt ;

4
La printffunzione offre un controllo migliore, specialmente se si desidera formattare i numeri. printf("%s\t%s\n", $5, $1)
McNisse,

1
C'è un refuso nella risposta sopra? cosa 5ssignifica inawk {'printf ("%5s\t%s\n", $5, $1)'}
Vishal,

67

Un'altra tecnica specifica per awk, usa il "separatore del campo di output"

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

La virgola è cruciale qui.


questo funziona ma fa $1andare a newline
loretoparisi il

9

Un modo semplice per ottenere schede è:

awk {'print $5"\t"$1'}

6

So che questo è un vecchio thread, ma sto solo imparando e ho trovato utili questi post. La mia soluzione migliore era usare gawk per inserire spazi tra le variabili per te.

ls -la | gawk '{print $1, $9}'

3
-1: niente di nuovo. gawk, mawko qualsiasi altro awk, tutti inseriscono spazi se si utilizza la virgola, che è ciò che dice questa risposta .
Muru,

1
Dovrebbe essere ls -la | awk '{print $1, $9}'. Come ha detto Muru gawknon è necessario.
Nick Crawford,

1

Per posizionare lo spazio tra gli argomenti, basta aggiungere " ", ad es awk {'print $5" "$1'}.

Tuttavia è non raccomanda di uscita parse di lscomando , dato che non è affidabile e di uscita è per gli esseri umani, non script. Pertanto utilizzare comandi alternativi come findo stat.

Ecco un esempio 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

che stamperà un output intuitivo (in forma concisa), in modo da poter ottenere esattamente ciò di cui hai bisogno. Quindi utilizzare -cdi utilizzare formato specifico, o l'uso awk, cuto readper ottenere le colonne di destra.

Controlla stat --helpulteriori opzioni. Ad esempio per stampare il giorno della modifica, controllare questo esempio .


Sembra che l'OP stia cercando di analizzare l'output per scopi di lettura umana e non per eseguire uno script (come for i in ls; do $i).
mchid
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.