Có cách nào để in dòng cuối cùng của tệp sau đó dòng đầu tiên của tệp chỉ trong awk không?


7

Tôi đã tìm kiếm, nhưng đã đưa ra một câu trả lời ngắn. Tôi muốn in dòng cuối cùng (hoặc bản ghi) trong một tệp; sau đó in dòng đầu tiên chỉ sử dụng awk. Tôi biết cách in dòng đầu tiên:

NR == 1{print}

và dòng cuối cùng

END{print}

Tuy nhiên, làm thế nào tôi có thể chuyển đổi vị trí? Nó thậm chí có thể? Tôi chỉ nhận được lỗi khi tôi cố gắng làm như vậy. Có cách nào để tích hợp

NR == 1{print}

lệnh vào lệnh END? Một lần nữa, tôi chỉ muốn thực hiện điều này trong awk. Cảm ơn!

Câu trả lời:


18

Chỉ cần lưu dòng đầu tiên vào một biến

awk 'NR==1 {first = $0} END {print; print first}' file

Ví dụ. đưa ra filenhư

line 1
line 2
line 3
line 4
line 5

sau đó

$ awk 'NR==1 {first = $0} END {print; print first}' file
line 5
line 1

Là người mới đối với awk, tôi đoán tôi không nghĩ mình có thể làm điều này, nhưng bạn đã chứng minh tôi sai. Cảm ơn bạn! Nó làm việc trên kết thúc của tôi!
Nack

+1; Nhưng một cải tiến nhỏ: Nếu tệp chỉ có một dòng, thì đầu ra sẽ lặp lại dòng đó ; Nếu tệp trống, thì đầu ra vẫn có hai dòng trống . Nếu đó không phải là điều mong muốn, thì chúng ta có thể kiểm tra hai trường hợp như thế này:awk 'NR==1 {first = $0; gotfirst = 1} END {if (gotfirst==1) {if (NR!=1) {print} print first}}' file
Prem

1

AWK có getline()chức năng cho phép tiến tới dòng tiếp theo. Trạng thái thoát của dòng này là 0 khi chúng tôi không thể tiến thêm nữa, tức là chúng tôi đã đạt đến cuối tệp. Do đó, ý tưởng cơ bản mà chúng ta có thể sử dụng là lưu trữ dòng đầu tiên thành biến, theo dõi dòng hiện tại và tiếp tục cố gắng tiến lên getline. Nếu chúng ta không thể - in các biến theo thứ tự mong muốn của họ.

$ cat input.txt
first line
middle line
last line

$ awk 'NR==1{first=$0};{while (getline line); printf "%s\n%s\n",line,first}' input.txt                                   
last line
first line
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.