2010-05-25 29 views
15

Tôi có dữ liệu mà trông như thế này:Extract dòng khi Cột K là trống với AWK/Perl

foo 78 xxx 
bar yyy 
qux 99 zzz 
xuq xyz 

Chúng được phân định tab. Làm thế nào tôi có thể trích xuất dòng mà cột 2 là trống rỗng, năng suất

bar yyy 
xuq xyz 

tôi đã cố gắng này, nhưng dường như không làm việc:

awk '$2==""' myfile.txt 

Trả lời

15

Bạn cần phải thiết lập đặc biệt là tách trường để một TAB nhân vật:

> cat qq.in 
    foo  78  xxx 
    bar    yyy 
    qux  99  zzz 
    xuq    xyz 
> cat qq.in | awk 'BEGIN {FS="\t"} $2=="" {print}' 
    bar    yyy 
    xuq    xyz 

hành vi mặc định cho awk là để điều trị một FS của SPACE (mặc định) là trường hợp đặc biệt. Từ trang người đàn ông:

Trong trường hợp đặc biệt mà FS là một không gian duy nhất, lĩnh vực được phân cách bằng chạy của không gian và/hoặc các tab và/hoặc dòng mới. (nghiêng của tôi)

+5

Bạn có thể chỉ định các tab char như một tùy chọn awk và không có trong mệnh đề BEGIN . Đây là cú pháp bash cho một thẻ char: 'awk -F $ '\ t' '$ 2 ==" "' file ...' –

3
grep -e '^.*\t\t.*$' myfile.txt 

sẽ grep mỗi dòng gồm ký tự tab-tab-ký tự (không có gì giữa các tab).

+1

@daotoad: anh ta nói "trích xuất các dòng nơi cột 2 trống". Nếu anh ta muốn CHỈ2 cột trống, anh ta phải chỉ định như vậy. Trong trường hợp đó, hãy thay thế. * Bằng phạm vi ký tự hợp lệ (hoặc đảo ngược phạm vi các ký tự không được phép). Có thể [^ \ t] sẽ làm. Phụ thuộc vào thông số kỹ thuật của anh ấy! – Konerak

+1

Trên thực tế, @daotoad, trong một tệp 3 cột, tôi nghĩ cách duy nhất để có được hai tab liên tiếp là nếu cột hai là trống bất kể trạng thái của cột một hoặc ba. Vì vậy, câu trả lời này vẫn có vẻ hợp lệ với tôi. – paxdiablo

+1

Đúng, gãi bình luận trước đó của tôi. Hai tab chỉ có thể xuất hiện trên "khoảng trống bên trong". Nói cách khác trên một bảng N cột (trong đó N> = 3) chúng có thể xuất hiện trên các cột từ 2 đến N-1. Vì chúng ta có một bảng ba cột, điều đó có nghĩa là 2 chỉ. Dấu phân tách trên các cột kết thúc là một dòng mới hoặc phần đầu/cuối của tệp. Sai lầm chứng minh rằng nó đã qua giờ đi ngủ của tôi. Xin lỗi vì lỗi. – daotoad

5
perl -F/\t/ -lane 'print unless $F[1] eq q//' myfile.txt 

lệnh Công tắc

  • -F nói Perl gì delimiter để autosplit trên (tab trong trường hợp này)
  • -a cho phép chế độ autosplit, chia mỗi dòng trên delimiter quy định để cư một mảng @F
  • -l sẽ tự động nối thêm dòng mới "\n" vào cuối mỗi prin ted dòng
  • -n xử lý các tập tin line-by-line
  • -e xử lý đối số trích dẫn đầu tiên là mã và không phải là một tên tập tin
+1

Công việc tuyệt vời với tính năng tự động sửa!Tôi luôn luôn quên nó và kết thúc bằng cách viết các đoạn mã nhỏ khi một lớp lót sẽ làm. Chẳng phải đó là 'in nếu $ F [1] eq '''? Nếu không, một cột như 'aaa 0 bbb' sẽ được in. Ngoài ra, đối với shell/perl của tôi, tùy chọn '-F' cần phải là' -F '\ t'' hoặc '-F" \ t "', nó không giống '-F/\ t /' mặc dù cái gì perlrun nói. Tôi có thể nhận được xung quanh nội suy với '-F =/\\ t /' quá, nhưng nó khá xấu xí. – daotoad

Các vấn đề liên quan