So trennen Sie Felder mit Leerzeichen oder Tabulator in awk

52

Während des Spielens awkkam ich zur Ausführung:

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

Dies ergibt eine Ausgabe wie:

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

Wie kann ich ein Leerzeichen zwischen diesen beiden Freunden der Ausgabe bekommen?

rɑːdʒɑ
quelle
1
Als Empfehlung sollten Sie die Ausgabe von nicht analysieren ls. Dies wird Sie früher oder später in den Rücken beißen.
gniourf_gniourf
In awk, um zwei Zeichenfolgen zu verketten, platzieren Sie sie einfach nebeneinander -print $5 $1
Glenn Jackman
2
@kenorb und enge Wähler, das verknüpfte Duplikat ist überhaupt kein Duplikat. Sie wissen bereits, wie Felder nach Prämisse ( awk {'print $5 $1'} a.txt) gedruckt werden . Sie fragen, wie ein Leerzeichen zwischen Feld 1 und Feld 5 eingefügt werden soll.
Kos

Antworten:

73

Ändern Sie einfach die Zeile zu

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

Dies sollte die Ausgabe mit Leerzeichen drucken.

Hoffe das hilft.

Bearbeiten:

Wie von McNisse vorgeschlagen, können Sie printf verwenden, um ein gutes Ausgabeformat zu erhalten

ls -la >> a.txt ; awk {'printf ("%5s\t%s\n", $5, $1)'} a.txt ;
devav2
quelle
4
Die printfFunktion bietet eine bessere Kontrolle, insbesondere wenn Sie Zahlen formatieren möchten. printf("%s\t%s\n", $5, $1)
McNisse
1
Gibt es einen Tippfehler in der obigen Antwort? Was 5sbedeutet inawk {'printf ("%5s\t%s\n", $5, $1)'}
Vishal
67

Eine andere awk-spezifische Technik ist der "Output Field Separator".

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

Das Komma ist hier entscheidend.

Glenn Jackman
quelle
Das funktioniert, aber $1ich muss zu Newline gehen
loretoparisi
9

Ein einfacher Weg, um Tabs zu bekommen, ist:

awk {'print $5"\t"$1'}
becko
quelle
6

Ich weiß, dass dies ein alter Thread ist, aber ich lerne gerade und fand diese Beiträge hilfreich. Meine beste Lösung war es, mit gawk Leerzeichen zwischen den Variablen einzufügen.

ls -la | gawk '{print $1, $9}'
codeJediNinjaDork
quelle
3
-1: Nichts Neues. gawk, mawkOder jede andere awk, sie alle Einsatzräume , wenn Sie das Komma, das ist es, was diese Antwort sagt.
Muru
1
Sollte sein ls -la | awk '{print $1, $9}'. Wie Muru sagte, gawkist nicht notwendig.
Nick Crawford
1

Um das Leerzeichen zwischen den Argumenten einzufügen " ", fügen Sie einfach z awk {'print $5" "$1'}.

Es wird jedoch nicht empfohlen, die Befehlsausgabe zu analysierenls , da sie nicht zuverlässig ist und die Ausgabe für Menschen und nicht für Skripte bestimmt ist. Verwenden Sie daher alternative Befehle wie findoder stat.

Hier ist ein Beispiel mit 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

Hiermit drucken Sie maschinenfreundliche Ausgaben (in knapper Form), sodass Sie genau das erhalten, was Sie benötigen. Verwenden Sie dann -cspezifisches Format zu verwenden, oder die Verwendung awk, cutoder readdie richtigen Spalten zu erhalten.

Prüfen Sie, ob stat --helpweitere Optionen verfügbar sind. Wenn Sie beispielsweise den Tag der Änderung drucken möchten, aktivieren Sie dieses Beispiel .

Kenorb
quelle
Es scheint, dass das OP versucht, die Ausgabe für menschliche Lesezwecke und nicht zum Ausführen eines Skripts (wie for i in ls; do $i) zu analysieren .
mchid vor