Jak oddzielić pola spacją lub tabulatorem w awk

51

Podczas zabawy awkprzyszedłem wykonać:

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

Daje to wyniki takie jak:

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

Jak mogę uzyskać odstęp między tymi dwoma przyjaciółmi produkcji?

rɑːdʒɑ
źródło
1
Jako porady nie należy analizować wyniku działania ls. To prędzej czy później ugryzie cię w plecy.
gniourf_gniourf
W awk, aby połączyć dwa łańcuchy, po prostu umieść je obok siebie -print $5 $1
glenn jackman
2
@kenorb i bliscy wyborcy, połączony duplikat wcale nie jest duplikatem. Wiedzą już, jak drukować pola według przesłanek ( awk {'print $5 $1'} a.txt). Pytają, jak umieścić spację między polem nr 1 a polem nr 5.
Kos

Odpowiedzi:

72

Po prostu zmień linię na

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

to powinno wydrukować wynik ze spacjami.

Mam nadzieję że to pomoże.

Edytować:

Jak sugeruje McNisse , możesz użyć printf, który zapewni ci dobry format wyjściowy

ls -la >> a.txt ; awk {'printf ("%5s\t%s\n", $5, $1)'} a.txt ;
devav2
źródło
4
Ta printffunkcja zapewnia lepszą kontrolę, szczególnie jeśli chcesz formatować liczby. printf("%s\t%s\n", $5, $1)
McNisse,
Czy w powyższej odpowiedzi jest literówka? co 5sznaczy inawk {'printf ("%5s\t%s\n", $5, $1)'}
Vishal
66

Inna technika specyficzna dla awk, użyj „separatora pola wyjściowego”

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

Przecinek jest tutaj kluczowy.

Glenn Jackman
źródło
to działa, ale powoduje $1przejście do nowej linii
loretoparisi
8

Prostym sposobem na uzyskanie zakładek jest:

awk {'print $5"\t"$1'}
becko
źródło
5

Wiem, że to stary wątek, ale dopiero się uczę i uważam, że te posty są pomocne. Moim najlepszym rozwiązaniem było użycie gawk do wstawiania spacji między zmiennymi.

ls -la | gawk '{print $1, $9}'
codeJediNinjaDork
źródło
3
-1: Nic nowego. gawk, mawklub jakikolwiek inny awk, wszystkie wstawiają spacje, jeśli użyjesz przecinka, co mówi ta odpowiedź .
muru
1
Powinno być ls -la | awk '{print $1, $9}'. Jak powiedział Muru, gawknie jest to konieczne.
Nick Crawford,
1

Aby umieścić spację między argumentami, wystarczy dodać " "np awk {'print $5" "$1'}.

Jednak jest to nie zaleca się analizować dane wyjściowe lspolecenia , ponieważ nie jest niezawodny i wyjście jest dla ludzi, a nie skryptów. Dlatego używaj alternatywnych poleceń, takich jak findlub stat.

Oto przykład użycia 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

który wydrukuje ci wyjście przyjazne dla maszyny (w zwięzłej formie), dzięki czemu możesz uzyskać dokładnie to, czego potrzebujesz. Następnie użyj -cużywać określonego formatu, lub użyć awk, cutalbo readuzyskać odpowiednie kolumny.

Sprawdź stat --helpdalsze opcje. Na przykład, aby wydrukować dzień modyfikacji, sprawdź ten przykład .

kenorb
źródło