Đối số phủ định cho đầu / đuôi


13

Các biến thể của câu hỏi này chắc chắn đã được hỏi nhiều lần ở những nơi khác nhau, nhưng tôi đang cố xóa những Mdòng cuối cùng khỏi một tập tin mà không gặp may.

Các câu trả lời thứ hai bình chọn nhất trong câu hỏi này khuyên bạn làm như sau để thoát khỏi dòng cuối cùng trong một tập tin:

head -n -1 foo.txt > temp.txt

Tuy nhiên, khi tôi thử điều đó trong OSX & Zsh, tôi nhận được:

head: illegal line count -- -1

Tại sao vậy? Làm cách nào tôi có thể xóa các dòng M cuối cùng các dòng đầu tiên N của một tệp đã cho?



1
Đầu ra của là head --versiongì? Bạn đang sử dụng hệ thống nào?
jofel

@jofel head --versiontrả về một lỗi thực sự.
Amelio Vazquez-Reina

Câu trả lời:


19

Bạn có thể xóa 12 dòng đầu tiên bằng:

tail -n +13

(Điều đó có nghĩa là in từ dòng thứ 13.)

Một số triển khai headnhư headhỗ trợ GNU :

head -n -12

nhưng đó không phải là tiêu chuẩn.

tail -r file | tail -n +12 | tail -r

sẽ hoạt động trên các hệ thống có tail -r(xem thêm GNU tac) nhưng không tối ưu.

n1 đâu

sed '$d' file

Bạn cũng có thể làm:

sed '$d' file | sed '$d'

để loại bỏ 2 dòng, nhưng điều đó không tối ưu.

Bạn có thể làm:

sed -ne :1  -e 'N;1,12b1' -e 'P;D'

Nhưng hãy cẩn thận, nó sẽ không hoạt động với giá trị lớn của n với một số sedtriển khai.

Với awk:

awk -v n=12 'NR>n{print line[NR%n]};{line[NR%n]=$0}'

Để xóa mcác dòng từ đầu và ncuối:

awk -v m=6 -v n=12 'NR<=m{next};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'

sed 'x;1d;$d'có thể được sử dụng để có được hai dòng cuối cùng là tốt. Và Nsau đó 1dcó thể được sử dụng để có được nhiều hơn một chút, mặc dù tại thời điểm đó, nó không mang lại lợi thế nào cho N;P;Dvòng lặp mà bạn đã đề xuất.
mikeerv

Cảm ơn bạn - Lệnh cuối cùng là vô cùng hữu ích. Một cảnh báo nhỏ mùa hè: nó không hoạt động khi mhoặc nđang 0. Nếu không nó sẽ hoàn hảo.
Amelio Vazquez-Reina

2

Bạn có thể sử dụng cách sau để xóa N dòng đầu tiên và dòng M cuối cùng.

Với N=5, M=7và tập tin test.txt:

sed -n -e "6,$(($(wc -l < test.txt) - 7))p" test.txt

Lệnh in tất cả các dòng từ N + 1 đến LastLine-M.

Một tùy chọn khác là sử dụng python:

python -c 'import sys;print "".join(sys.stdin.readlines()[5:-7]),' < test.txt

1

Bạn có thể xóa các dòng cuối cùng M(ở đây M = 100) khỏi một tệp có:

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
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.