In cột trong awk theo tên tiêu đề


11

Tôi có một tập tin văn bản như vậy

foo bar baz
1   a   alpha
2   b   beta
3   c   gamma

Tôi có thể sử dụng awk để in các cột nhất định, như 1 và 3, {print $1, $3}nhưng tôi muốn chỉ định các cột cần in bằng cách chỉ định tiêu đề của cột thay vào đó, đại loại như thế {print $foo, $baz}. Điều này rất hữu ích vì vậy tôi không phải mở tệp và đếm các cột theo cách thủ công để xem cột nào là cột và tôi không phải cập nhật tập lệnh nếu số cột hoặc thứ tự thay đổi. Tôi có thể làm điều này với awk (hoặc một công cụ shell khác) không?

Câu trả lời:


16
awk '
NR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
    }
}
{ print $(f["foo"]), $(f["baz"]) }
' file
foo baz
1 alpha
2 beta
3 gamma

Đó là một thành ngữ vô cùng hữu ích. Tôi có nhiều dữ liệu trong bảng tính và các bảng tính khác nhau có thể có một tập hợp con cột chung mà tôi quan tâm nhưng không nhất thiết phải theo cùng một thứ tự trên tất cả các bảng tính hoặc với cùng một số cột khác trước / giữa chúng để có thể xuất chúng dưới dạng CSV hoặc tương tự và sau đó chỉ cần chạy một tập lệnh awk bằng cách sử dụng tên cột thay vì số cột là hoàn toàn vô giá.


Đây là lời cảm ơn tuyệt vời và hoạt động cho mục đích của tôi. Bạn có thể làm rõ cách thức này hoạt động cho người mới bắt đầu awk? Cú pháp f [$ i] đang làm gì trong điều này và làm thế nào awk tìm ra cột nào khớp với chuỗi?
AlexLipp

Không có gì. Đó là cú pháp awk hoàn toàn cơ bản, chỉ cần tra cứu các trường và mảng trong trang awk man (hoặc google nó). Thêm print iprint $iprint f [$ i] `các câu lệnh trong vòng lặp, v.v. để theo dõi những gì đang xảy ra nếu điều đó có ích.
Ed Morton

0

Bạn yêu cầu awk, nhưng bạn cũng có thể sử dụng một công cụ chuyên dụng hơn cho việc này : csvtool.

csvtool -t ' ' -u ' ' namedcol foo,baz file

hoặc là

csvtool -t ' ' -u ' ' col 1,3 file

0

Giả sử rằng tệp là tệp TSV ("giá trị được phân tách bằng tab"), sử dụng csvkit:

$ csvcut -t -c foo,baz file.tsv
foo,baz
1,alpha
2,beta
3,gamma

Đầu ra sẽ được định dạng chính xác CSV, nhưng có thể dễ dàng thay đổi trở lại TSV:

$ csvcut -t -c foo,baz file.tsv | csvformat -T
foo     baz
1       alpha
2       beta
3       gamma

Các -ctùy chọn để csvcutcũng có thể tận số và phạm vi, và cũng có thể được sử dụng để sắp xếp lại các cột của dữ liệu đầu vào (một tính năng tôi thường bỏ lỡ trong tiêu chuẩn cuttiện ích).

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.