In nội dung tệp mà không có dòng đầu tiên và cuối cùng


54

Có một cách đơn giản để tôi có thể lặp lại một tập tin, bỏ qua các dòng đầu tiên và cuối cùng? Tôi đã xem xét đường ống từ headvào tail, nhưng đối với những người có vẻ như tôi sẽ phải biết tổng số đường ngay từ đầu. Tôi cũng đang nhìn split, nhưng tôi cũng không thấy cách nào để làm điều đó.

Câu trả lời:


97

Chỉ với sed, không có bất kỳ đường ống:

sed '1d;$d' file.txt

GHI CHÚ

  • 1có nghĩa là dòng đầu tiên
  • dcó nghĩa là xóa
  • ; là dấu phân cách cho 2 lệnh
  • $có nghĩa là dòng cuối cùng

36

Bạn không cần phải biết trước số lượng dòng. tailheadcó thể lấy một phần bù từ đầu hoặc cuối tệp tương ứng.

Đường ống này bắt đầu ở dòng thứ hai của tệp (bỏ qua dòng đầu tiên) và dừng ở dòng cuối cùng nhưng một (bỏ qua dòng cuối cùng). Để bỏ qua nhiều dòng ở đầu hoặc cuối, điều chỉnh các số cho phù hợp.

tail -n +2 file.txt | head -n -1

làm điều đó theo cách khác, tất nhiên hoạt động như nhau:

head -n -1 file.txt | tail -n +2

Tôi không biết tại sao, nhưng head -n -1xóa dòng VÀ đầu tiên trong .txttệp của tôi , trên Ubuntu 14.04.2LTS.
Sopalajo de Arrierez

9

Đây là cách thực hiện với awk:

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

Ngoài ra một cách khác cho sed:

sed '1d;x' file.txt

xsedlệnh nâng cao , nó chuyển dòng hiện tại với dòng trước: dòng đi vào bộ đệm và trước đó đi vào màn hình và cứ thế trong khi sedxử lý từng dòng theo dòng (đây là lý do tại sao dòng đầu tiên sẽ trống).

awkgiải pháp trên mỗi bước (dòng) đặt dòng hiện tại vào biến và bắt đầu in ra chỉ sau khi dòng thứ hai được truyền qua. Do đó, chúng tôi có các dòng shitfed trên màn hình từ thứ hai đến cuối cùng nhưng một. Dòng cuối cùng bị bỏ qua vì dòng này nằm trong biến và chỉ được in ở bước tiếp theo, nhưng tất cả các bước đã hết và chúng tôi không bao giờ thấy dòng trên màn hình.

Ý tưởng tương tự trong perl:

perl -ne 'print $t if $.>2 ; $t=$_' file.txt

$.là viết tắt của số dòng và $_ cho dòng hiện tại.
perl -nlà lối tắt cho while(<..>) {..}cấu trúc và -edành cho tập lệnh nội tuyến.


2

Trong python tôi sẽ làm như thế này.

#!/usr/bin/python3
import re
import sys
file = sys.argv[1]
with open(file, 'r') as f:
    L = []
    for line in f:
        line = re.sub(r'\n', r'', line)
        L.append(line)
    print('\n'.join(L[1:-1]))

Dán đoạn mã trên vào một tệp và đặt tên là script.py. Chạy đoạn script đối với tệp bạn muốn kiểm tra.

python3 script.py /path/to/the/file

Thí dụ:

$ cat file
foo
apple
banana
bar
$ python3 script.py file
apple
banana

2

Đối với người dùng Mac:

Trên Mac, head -n -1không hoạt động. Thay vào đó, đảo ngược tệp, cắt dòng đầu tiên, sau đó đảo ngược lại:

tail -r file.txt | tail -n +2 | tail -r

Giải trình:

  1. tail -r : đảo ngược thứ tự các dòng trong đầu vào của nó

  2. tail -n +2 : in tất cả các dòng bắt đầu từ dòng thứ hai trong đầu vào của nó

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.