Cetak konten file tanpa baris pertama dan terakhir


54

Apakah ada cara sederhana yang bisa saya gema file, lewati baris pertama dan terakhir? Saya sedang melihat perpipaan dari headdalam tail, tetapi bagi mereka sepertinya saya harus mengetahui garis total dari awal. Saya juga melihat split, tapi saya juga tidak melihat cara untuk melakukannya.

Jawaban:


97

Hanya dengan sed, tanpa pipa:

sed '1d;$d' file.txt

CATATAN

  • 1berarti baris pertama
  • dberarti menghapus
  • ; adalah pemisah untuk 2 perintah
  • $berarti baris terakhir

36

Anda tidak perlu tahu jumlah baris sebelumnya. taildan headdapat mengambil offset dari awal atau akhir file masing-masing.

Pipa ini dimulai pada baris kedua file (melompati baris pertama) dan berhenti pada yang terakhir kecuali satu (melompati baris terakhir). Untuk melewati lebih dari satu baris di awal atau akhir, sesuaikan angka sesuai.

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

melakukan hal sebaliknya, bekerja sama, tentu saja:

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

Saya tidak tahu mengapa, tetapi head -n -1menghapus baris pertama DAN terakhir dari .txtfile saya , di Ubuntu 14.04.2LTS.
Sopalajo de Arrierez

9

Inilah cara melakukannya awk:

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

Juga cara lain untuk sed:

sed '1d;x' file.txt

xadalah sedperintah tingkat lanjut , ia beralih baris saat ini dengan yang sebelumnya: saat ini masuk ke buffer dan sebelumnya pergi ke layar dan seterusnya saat sedmemproses aliran baris demi baris (inilah sebabnya baris pertama akan kosong).

awksolusi pada setiap langkah (baris) menempatkan baris saat ini ke dalam variabel dan mulai mencetaknya hanya setelah baris kedua dilewati. Dengan demikian, kami mendapat urutan garis shitfed pada layar dari yang kedua ke yang terakhir. Baris terakhir dihilangkan karena baris dalam variabel dan harus dicetak hanya pada langkah berikutnya, tetapi semua langkah sudah habis dan kita tidak pernah melihat garis di layar.

Gagasan yang sama di perl:

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

$.singkatan dari nomor baris dan $_ untuk baris saat ini.
perl -nadalah jalan pintas untuk while(<..>) {..}struktur dan -euntuk skrip inline.


2

Dengan python saya akan melakukan seperti ini.

#!/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]))

Rekatkan kode di atas ke dalam file dan beri nama script.py. Jalankan skrip terhadap file yang ingin Anda periksa.

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

Contoh:

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

2

Untuk pengguna Mac:

Di Mac, head -n -1tidak berfungsi. Alih-alih, balikkan file, potong baris pertama, lalu balikkan kembali:

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

Penjelasan:

  1. tail -r : membalik urutan garis dalam inputnya

  2. tail -n +2 : mencetak semua baris mulai dari baris kedua di inputnya

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.