Cara memisahkan bidang dengan spasi atau tab dalam awk


53

Saat bermain dengan awksaya datang untuk mengeksekusi:

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

Ini memberikan output seperti:

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

Bagaimana saya bisa mendapatkan ruang antara dua teman output ini?


1
Sebagai saran, Anda tidak harus melewatkan output dari ls. Ini akan menggigit Anda di bagian belakang, cepat atau lambat.
gniourf_gniourf

Dalam awk, untuk menggabungkan dua string, Anda hanya menempatkan mereka berdampingan -print $5 $1
glenn jackman


2
@kenorb dan tutup pemilih, duplikat tertaut bukan duplikat sama sekali. Mereka sudah tahu cara mencetak bidang berdasarkan premis ( awk {'print $5 $1'} a.txt). Mereka bertanya bagaimana menempatkan spasi di antara bidang # 1 dan bidang # 5.
kos

Jawaban:


73

Ubah saja baris menjadi

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

ini harus mencetak output dengan spasi.

Semoga ini membantu.

Sunting:

Seperti yang disarankan oleh McNisse Anda dapat menggunakan printf, yang akan memberi Anda format output yang baik

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

4
The printfberfungsi memberikan kontrol yang lebih baik, khususnya jika Anda ingin nomor Format. printf("%s\t%s\n", $5, $1)
McNisse

1
Apakah ada kesalahan ketik pada jawaban di atas? apa 5sartinya diawk {'printf ("%5s\t%s\n", $5, $1)'}
Vishal

67

Teknik awk-spesifik lain, gunakan "pemisah bidang keluaran"

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

Koma sangat penting di sini.


ini berfungsi tetapi menyebabkan $1untuk pergi ke baris baru
loretoparisi

9

Cara mudah untuk mendapatkan tab adalah:

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

6

Saya tahu ini adalah utas lama, tetapi saya baru belajar dan menganggap posting ini bermanfaat. Solusi terbaik saya adalah menggunakan gawk untuk menyisipkan spasi di antara variabel untuk Anda.

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

3
-1: Tidak ada yang baru. gawk,, mawkatau lainnya awk, mereka semua menyisipkan spasi jika Anda menggunakan koma, yang merupakan jawaban dari kata ini.
muru

1
Seharusnya ls -la | awk '{print $1, $9}'. Seperti yang dikatakan muru gawktidak perlu.
Nick Crawford

1

Untuk menempatkan spasi di antara argumen, cukup tambahkan " ", mis awk {'print $5" "$1'}.

Namun tidak disarankan untuk memls - parsing output dari perintah , karena tidak dapat diandalkan dan output untuk manusia, bukan skrip. Oleh karena itu gunakan perintah alternatif seperti findatau stat.

Berikut ini contoh menggunakan 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

yang akan mencetak Anda hasil yang ramah mesin (dalam bentuk singkat), sehingga Anda bisa mendapatkan apa yang Anda butuhkan. Kemudian gunakan -cuntuk menggunakan format tertentu, atau gunakan awk, cutatau readuntuk mendapatkan kolom yang tepat.

Periksa stat --helpopsi selanjutnya. Misalnya untuk mencetak hari modifikasi, periksa contoh ini .


Tampaknya OP sedang mencoba mengurai output untuk keperluan membaca manusia dan bukan untuk keperluan menjalankan skrip (seperti for i in ls; do $i).
mchid
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.