2012-04-19 35 views
10

getline đọc ở dòng tiếp theo và tăng số NR truy cập bằng 1. Sau khi sử dụng getline, awk hồ sơ làm việc với dòng tiếp theo. Đây là hành vi mong muốn trong hầu hết các trường hợp.Peek ở dòng kế tiếp, nhưng không tiêu thụ nó

Trong trường hợp đặc biệt, tôi chỉ cần nhìn trộm dòng tiếp theo và tùy thuộc vào nội dung của nó, tôi đọc dòng tiếp theo hoặc tôi cần quay lại một dòng.

Làm cách nào để quay lại một dòng trong awk? Tôi đã thử đặt số đếm NR theo cách thủ công thành NR=NR-1 nhưng cách này không hoạt động. Hoặc là có một phương pháp chỉ nhìn vào dòng tiếp theo mà không thay đổi NR?

Tôi cần một giao diện của một dòng. Đơn giản chỉ cần lưu các dòng trong một biến và đề cập đến nó sau này không hoạt động trong trường hợp này. Tôi đang cố gắng triển khai công cụ lập trình biết chữ theo số awk, trong đó tệp chính có thể chứa nhiều tệp con. Một tệp phụ như vậy bắt đầu bằng một dòng như "% file:file1". Kết thúc của một tập tin như vậy là đạt được, nếu một dòng với một thụt đầu dòng thấp hơn hoặc dòng khác với một dòng như "% file:file2" là đạt được.

Quy tắc đặt cho tất cả các dòng khớp với /% file:/ không được sử dụng, khi tôi đã đọc dòng này với đường nối. Đó là lý do tại sao tôi muốn đặt lại NR thành dòng trước đó, sau đó awk sẽ đọc lại dòng phù hợp với /% file:/ và quy tắc thích hợp sẽ được thực thi.

+1

Tôi đã phát triển ngôn ngữ soạn thảo văn bản có tên là TXR có tính năng khớp mẫu với tính năng quay ngược ngầm định ở cả chế độ kết hợp ("ngang") và định hướng ký tự ("ngang"). Độ sâu lookahead là số ký tự hoặc dòng tùy ý. TXR gần như lý tưởng cho nhiệm vụ xử lý ký hiệu lập trình biết chữ. Thật khó để đưa ra một ví dụ có liên quan trực tiếp; bạn có thể đăng một đặc điểm kỹ thuật hoàn chỉnh của ký pháp biết chữ? – Kaz

Trả lời

1

Đây là một chút của một hack và khá đắt tiền, nhưng đối với các file nhỏ không cung cấp cho bạn một lookahead:

cmd="sed -n " NR + 1 "p " FILENAME; cmd | getline nextline 

đó sẽ đưa giá trị hiện tại của NR và sử dụng sed để trích xuất NR dòng + 1 từ tệp đầu vào. Điều này là tốn kém vì sed sẽ đọc qua toàn bộ tập tin mỗi khi bạn làm một lookahead (bạn có thể làm giảm bớt một chút bằng cách thêm lệnh 'q' vào sed). Biến tiếp theo sẽ được đặt thành dòng tiếp theo của tệp và sẽ được để trống trên dòng cuối cùng.

10

Điều này có thể tiếp cận những gì bạn đang tìm kiếm và không nên tốn kém như giải pháp sed vì AWK duy trì một con trỏ vào tệp mà getline mở ra.

awk 'FNR == 1 { 
     getline nextline < FILENAME 
    } 
    { 
     getline nextline < FILENAME; 
     print "currentline is:", $0; 
     print "nextline is: ", nextline 
    }' input file 

Khối đầu tiên đọc dòng đầu tiên và lãng phí nó.

Trong biểu mẫu này, getline không đặt bất kỳ biến nào như NR, FNR, NF hoặc $0. Nó chỉ đặt biến mà bạn cung cấp (nextline trong trường hợp này).

Xem this để biết thêm thông tin.

+0

Xấu hổ, điều này dường như là GNU bẻ cong cụ thể. – 0xC0000022L

+0

@ 0xC0000022L: Nó hoạt động với tôi dưới 'mawk'. –

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