2012-01-04 26 views
19

Tôi đang cố gắng viết một tập lệnh awk để kiểm tra các điều kiện nhất định và ném các đường đi gặp các điều kiện đó.Làm cách nào để chuyển sang dòng tiếp theo khi điều kiện đã được thực hiện?

Điều kiện cụ thể là vứt bỏ hai dòng đầu tiên của tệp và bất kỳ dòng nào bắt đầu bằng văn bản xyzzy:. Để kết thúc, tôi đã mã hóa:

awk ' 
    NR < 2 {} 
    /^xyzzy:/ {} 
       {print}' 

nghĩ rằng nó sẽ loại bỏ các đường mà một trong hai điều kiện đó được đáp ứng và in khác.

Thật không may, có vẻ như print đang được xử lý ngay cả khi dòng khớp với một trong hai mẫu khác.

Có hành động nào giống như C continue sẽ chuyển sang dòng kế tiếp bỏ qua tất cả các kiểm tra điều kiện khác cho dòng hiện tại không?

Tôi cho rằng tôi có thể sử dụng thứ gì đó như ((NR > 1) && (!/^xyzzy:/)) {print} làm quy tắc thứ ba nhưng điều đó có vẻ hơi xấu với tôi.

Ngoài ra, có cách nào khác để thực hiện việc này không?

+0

Tôi không có chuyên môn về 'awk' nhưng đây là một sự tốt đẹp [hướng dẫn] (http://www.grymoire.com/Unix/Awk. html) mà tôi thấy rất hữu ích khi tôi bắt đầu học nó. Và tất nhiên có một [hướng dẫn phức tạp] (http://www.gnu.org/software/gawk/manual/gawk.pdf). Nhưng tôi thích hướng dẫn về sách. :) –

Trả lời

29

Sử dụng các từ khóa next như hành động của bạn

Từ khóa này thường rất hữu ích khi bạn muốn để lặp qua 2 tác phẩm; đôi khi đó là cùng một tệp mà bạn muốn xử lý hai lần.

Bạn sẽ thấy các thành ngữ sau:

awk ' 
FNR==NR { 
    < stuff that works on file 1 only > 
    next 
} 
{ 
    < stuff that works on file 2 only > 
}' ./infile1 ./infile2 
+0

Ah, nên đã thử Perlish 'next' trước khi đăng bài. P.S. Tôi đã cố gắng 'NR = <2' và nó barfed vì vậy tôi giả sử bạn có nghĩa là' NR <= 2' (và cố định cho phù hợp). Chúc mừng. – paxdiablo

+0

oops, đúng, đó là ý tôi. – SiegeX

+1

'next' là một trong ** ** các tính năng tốt nhất trong 'awk'. :) –

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