2012-01-13 34 views
20

Tôi đang cố gắng xóa hai dòng đầu tiên của một tệp bằng cách không in nó vào một tệp khác. Tôi không tìm kiếm thứ gì đó lạ mắt. Dưới đây là của tôi (thất bại) nỗ lực awk:Xóa hai dòng đầu tiên của một tệp bằng BASH hoặc awk hoặc sed hoặc bất kỳ số nào

awk '{ (NR > 2) {print} }' myfile 

Đó ném ra các lỗi sau:

awk: { NR > 2 {print} } 
awk:  ^syntax error 

Ví dụ:

nội dung của 'myfile':

blah 
blahsdfsj 
1 
2 
3 
4 

gì Tôi muốn kết quả là:

1 
2 
3 
4 

Trả lời

51

Sử dụng đuôi:

tail -n+3 file 

từ trang người đàn ông:

-n, --lines=K 
      output the last K lines, instead of the last 10; or use -n +K 
      to output lines starting with the Kth 
+4

Nên là +3 (bắt đầu trên dòng thứ 3) ... – cmbuckley

+0

Cần phải có 'đuôi -n + 3 tệp', nhưng cảm ơn! – Amit

16

Bạn đang gần đó. Thay vào đó, hãy thử thay thế:

awk 'NR > 2 { print }' myfile 

awk là quy tắc và quy tắc xuất hiện trần (nghĩa là không có dấu ngoặc) trước khi khối nó thực thi nếu nó vượt qua.

Cũng như Jaypal đã chỉ ra, trong awk nếu tất cả các bạn muốn làm là in dòng phù hợp với các quy tắc bạn thậm chí có thể bỏ qua các hành động, do đó đơn giản hóa các lệnh để:

awk 'NR > 2' myfile 
+0

Ông cũng có thể đặt một 'if' trước dấu ngoặc đơn, mặc dù cách của bạn tốt hơn, vì nó không tham gia mọi dòng, chỉ là những cái đã khớp. –

+1

Bạn thậm chí không cần '{print}'. Cách thức 'awkish' sẽ là' awk 'NR> 2' myfile' –

20

Làm thế nào về:

tail +3 file 

HOẶC

awk 'NR>2' file 

HOẶC

sed '1,2d' file 
+1

Một biến thể khác của sed: 'sed -n '3, $ p' file' – anubhava

4

awk dựa trên các tuyên bố pattern{action}. Trong trường hợp của bạn, số patternNR>2action bạn muốn thực hiện là print. Điều này action cũng là default action của awk.

Vì vậy, mặc dù

awk 'NR>2{print}' filename

sẽ làm việc tốt, bạn có thể rút ngắn nó để

awk 'NR>2' filename.

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