Cách tách các trường bằng dấu cách hoặc tab trong awk


52

Trong khi chơi với awktôi đã thực hiện:

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

Điều này mang lại đầu ra như:

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

Làm thế nào tôi có thể có được một khoảng trống giữa hai người bạn đầu ra này?


1
Theo lời khuyên, bạn không nên phân tích đầu ra của ls. Điều này sẽ cắn bạn ở phía sau sớm hay muộn.
gniourf_gniourf

Trong awk, để nối hai chuỗi, bạn chỉ cần đặt chúng cạnh nhau -print $5 $1
glenn jackman


2
@kenorb và cử tri đóng, bản sao được liên kết hoàn toàn không phải là bản sao. Họ đã biết cách in các trường bằng tiền đề ( awk {'print $5 $1'} a.txt). Họ đang hỏi làm thế nào để đặt một khoảng trắng ở giữa trường số 1 và trường số 5.
kos

Câu trả lời:


73

Chỉ cần thay đổi dòng thành

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

Điều này sẽ in đầu ra với không gian.

Hi vọng điêu nay co ich.

Biên tập:

Theo đề xuất của McNisse, bạn có thể sử dụng printf, cung cấp cho bạn định dạng đầu ra tốt

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

4
Các printfchức năng cung cấp điều khiển tốt hơn, đặc biệt nếu bạn muốn số định dạng. printf("%s\t%s\n", $5, $1)
McNisse

1
Có một lỗi đánh máy trong câu trả lời trên? có 5snghĩa là gì trongawk {'printf ("%5s\t%s\n", $5, $1)'}
Vishal

67

Một kỹ thuật cụ thể khác của awk, sử dụng "dấu tách trường đầu ra"

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

Dấu phẩy là rất quan trọng ở đây.


điều này hoạt động nhưng nguyên nhân $1để đi đến dòng mới
loretoparisi

9

Một cách đơn giản để nhận các tab là:

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

6

Tôi biết đây là một chủ đề cũ, nhưng tôi chỉ tìm hiểu và thấy những bài viết này hữu ích. Giải pháp tốt nhất của tôi là sử dụng gawk để chèn khoảng trắng giữa các biến cho bạn.

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

3
-1: Không có gì mới. gawk, mawkhoặc bất kỳ thứ gì khác awk, tất cả chúng đều chèn khoảng trắng nếu bạn sử dụng dấu phẩy, đó là những gì câu trả lời này nói.
muru

1
Nên ls -la | awk '{print $1, $9}'. Như muru nói gawkkhông cần thiết.
Nick Crawford

1

Để đặt khoảng trắng giữa các đối số, chỉ cần thêm " ", ví dụ awk {'print $5" "$1'}.

Tuy nhiên, không nên phân tích đầu ra của lslệnh , vì nó không đáng tin cậy và đầu ra là cho con người, không phải cho các tập lệnh. Do đó sử dụng các lệnh thay thế như findhoặc stat.

Dưới đây là ví dụ sử dụng 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

sẽ in cho bạn đầu ra thân thiện với máy (ở dạng ngắn gọn), do đó bạn có thể nhận được chính xác những gì bạn cần. Sau đó sử dụng -cđể sử dụng định dạng cụ thể, hoặc sử dụng awk, cuthoặc readđể có được các cột phải.

Kiểm tra stat --helpcác tùy chọn khác. Ví dụ để in ngày sửa đổi, kiểm tra ví dụ này .


Có vẻ như OP đang cố phân tích đầu ra cho mục đích đọc của con người chứ không phải cho mục đích chạy tập lệnh (như for i in ls; do $i).
mchid
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.