İlk ve son satırlar olmadan dosya içeriğini yazdır


54

İlk ve son satırları atlayarak bir dosyayı ekleyebileceğim basit bir yol var mı? Ben gelen boru bakıyordu headiçine tail, ama en başından itibaren toplam satırları bilmesi gerekir gibi olanlar için görünüyor. Ben de bakıyordum splitama onunla da yapmanın bir yolunu görmüyorum.

Yanıtlar:


97

Sadece sed, boru olmadan

sed '1d;$d' file.txt

NOT

  • 1ortalama ilk satır
  • dortalama sil
  • ; 2 komut için ayırıcı
  • $ortalama son satır

36

Satır sayısını önceden bilmek gerekmez. tailve headsırasıyla dosyanın başından veya sonundan bir denge alabilir.

Bu boru dosyanın ikinci satırında başlar (ilk satırı atlayarak) ve sonuncusunda durur (son satırı atlayarak). Başında veya sonunda birden fazla satırı atlamak için sayıları uygun şekilde ayarlayın.

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

diğer tarafa doğru yapmak elbette aynı şekilde çalışır:

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

Nedenini bilmiyorum, ama Ubuntu 14.04.2LTS'deki dosyamın head -n -1ilk VE son satırını .txtsiler.
Sopalajo de Arrierez,

9

İşte nasıl yapılır awk:

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

Ayrıca bunun için başka bir yol sed:

sed '1d;x' file.txt

xgelişmiş sedkomuttur, mevcut satırı öncekiyle değiştirir: akım arabelleğe gider ve önceki ekrana geçer ve sedsatır satır işlenirken devam eder (bu yüzden ilk satır boş kalır ).

awkHer adımdaki çözüm (satır), geçerli satırı değişkenin içine koyar ve yalnızca ikinci satır geçtikten sonra yazdırmaya başlar. Böylece ekranda ikinciden en sonuncuya doğru çizgiler dizildi. Son satır, satır değişkende olduğundan çıkarılır ve yalnızca bir sonraki adımda yazdırılmalıdır, ancak tüm adımlar zaten bitmiştir ve çizgiyi asla ekranda görmeyiz.

Aynı fikir perl:

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

$.satır numarası ve $_ geçerli satır anlamına gelir . yapı
perl -niçin kısayol while(<..>) {..}ve -esatır içi komut dosyası içindir.


2

Python'da böyle yapardım.

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

Yukarıdaki kodu bir dosyaya yapıştırın ve olarak adlandırın script.py. Komut dosyasını kontrol etmek istediğiniz dosyaya karşı çalıştırın.

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

Örnek:

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

2

Mac kullanıcıları için:

Mac'te head -n -1çalışmıyor. Bunun yerine, dosyayı ters çevirin, ilk satırı kesin, sonra geriye doğru çevirin:

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

Açıklama:

  1. tail -r : girişindeki satırların sırasını ters çevirir

  2. tail -n +2 : girişindeki ikinci satırdan başlayarak bütün satırları yazdırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.