2013-04-06 26 views
16

Tôi đang học awk/gawk. Vì vậy, gần đây tôi chỉ cố gắng giải quyết bất kỳ vấn đề với nó để đạt được nhiều cơ hội thực hành hơn.cách dễ nhất để loại bỏ dòng 1 và dòng cuối cùng khỏi tệp với awk là gì?

Đồng nghiệp của tôi hỏi một câu hỏi ngày hôm qua,

"làm thế nào để loại bỏ dòng đầu tiên và cuối cùng từ tập tin"

. Tôi biết rằng sed '1d;$d' file sẽ hoạt động. cũng head/tail cũng hoạt động ngay cả khi hiệu suất kém. Tôi đã nói với anh ta một sed, anh ấy hạnh phúc.

Sau đó, tôi đã cố gắng để viết một awk một liner: cho đến nay những gì tôi nhận được là:

awk 'NR>1{a[++k]=$0}END{for(i=1;i<k;i++)print a[i]}' 

này sẽ lưu trữ toàn bộ file trong mảng chỉ để bỏ qua những dòng cuối cùng. Tôi cảm thấy rằng có phải là một cách dễ dàng hơn (hoặc cao hơn) để làm điều đó ..

(nếu không có dễ dàng hơn hoặc nhanh hơn hoặc cách tốt hơn, tôi sẽ loại bỏ các câu hỏi)

cảm ơn bạn.

Trả lời

40

này hiện các trick:

awk 'NR>2 {print last} {last=$0}' 

awk thực hiện các hành động print last chỉ khi NR> 2 (có nghĩa là, trên tất cả các dòng nhưng 2 đầu tiên). Trên tất cả các dòng, nó đặt biến số last thành dòng hiện tại. Vì vậy, khi awk đọc dòng thứ ba, nó in dòng 2 (được lưu trữ trong last). Khi nó đọc dòng cuối cùng (dòng n) nó in nội dung của dòng n-1. Hiệu ứng ròng là các dòng từ 2 đến n-1 được in.

+1

CÓ !!! Tôi mặc dù theo cách này quá, nhưng đã cho 'NR> 1' .. sau đó đã từ bỏ ... urrrr. không nghĩ về NR> 2 chút nào, thật là ngu ngốc! .. tuyệt vời! cảm ơn bạn! lên! – Imagination

+0

cần chờ một vài phút để đánh dấu là chấp nhận .... – Imagination

+0

Tâm giải thích bit ma thuật chi tiết hơn? – eMPee584

5

Hãy để tôi đề xuất một giải pháp khác. Trong trường hợp nếu bạn cần tùy chỉnh N cho dòng trên và dưới bạn có thể sử dụng đuôiđầu lệnh:

awk '{print $1}' | head -n -1 | tail -n+2 

đầu -n -1 - loại bỏ dòng cuối cùng

đuôi - n + 2 - bắt đầu xuất từ ​​dòng thứ hai (loại bỏ 1 dòng)

Lệnh sau sẽ xóa 3 dòng từ trên xuống dưới:

awk '{print $1}' | head -n -3 | tail -n +4 

Trên thực tế, chúng tôi thậm chí không cần awk đây:

more | head -n -1 | tail -n +2 

hoặc

cat | head -n -1 | tail -n +2 

Nhờ Igor Fobia bình luận!

+2

Tôi thích giải pháp này, nhưng bây giờ awk là thừa. Bạn chỉ cần làm 'thêm tên tập tin | đầu -n -1 | tail -n + 2' –

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