Vytisknout obsah souboru bez prvního a posledního řádku

Existuje jednoduchý způsob, jak mohu ozvěnu souboru přeskočit první a poslední řádek? Díval jsem se na potrubí z head do tail, ale pro ty to vypadá, jako bych od začátku musel znát celkový počet řádků. Také jsem se díval na split, ale ani já s tím nevidím způsob, jak to udělat.

Odpovědět

Pouze s sed, bez jakýchkoli trubek:

sed "1d;$d" file.txt 

POZNÁMKA

  • 1 znamenat první řádek
  • d průměr delete
  • ; je oddělovač pro 2 příkazy
  • $ průměr poslední řádek

Odpovědět

Počet řádků předem znát nemusíte. tail a head mohou mít posun od začátku nebo konce souboru.

Toto potrubí začíná na druhý řádek souboru (přeskočí první řádek) a zastaví se na předposledním (přeskočí poslední řádek). Chcete-li přeskočit více než jeden řádek na začátku nebo na konci, upravte odpovídajícím způsobem čísla.

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

když to děláte opačně, funguje to samozřejmě stejně:

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

Komentáře

  • Nemám ' t vědět proč, ale head -n -1 odstraní první a poslední řádek mého .txt souboru na Ubuntu 14.04.2LTS.
  • V systému MacOS head -n -1 říká head: illegal line count -- -1
  • head -n -1 pracuje s GNU coreutils, možná má MacOS nějakou variantu BSD?

Odpověď

Zde je postup, jak to udělat s awk:

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

Také další způsob pro sed:

sed "1d;x" file.txt 

x je pokročilý sed příkaz, přepíná aktuální řádek pomocí předchozí: proud jde do vyrovnávací paměti a předchozí s přejde na obrazovku atd., zatímco sed zpracovává stream řádek po řádku (proto bude první řádek prázdný).

na každém kroku (řádku) vloží aktuální řádek do proměnné a začne jej tisknout až poté, co projde druhý řádek. Tak jsme na obrazovce dostali posranou posloupnost řádků od druhé po předposlední. Poslední řádek je vynechán, protože řádek je v proměnné a měl by být vytištěn pouze v dalším kroku, ale všechny kroky již došly a řádek na obrazovce nikdy nevidíme.

Stejný nápad v perl:

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

$. znamená číslo řádku a $_ aktuální řádek.
perl -n je zkratka pro while(<..>) {..} struktura a -e je pro vložený skript.

Odpověď

Pro uživatele systému Mac:

V systému Mac nefunguje. Místo toho soubor obráťte, odřízněte první řádek a poté jej otočte zpět:

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

Vysvětlení:

  1. tail -r: obrátí pořadí řádků v jeho vstupu

  2. tail -n +2: vytiskne všechny l ines počínaje druhým řádkem v jeho vstupu

Komentáře

  • To by selhalo s head: illegal line count -- -1 abych byl přesný.

Odpověď

V pythonu bych to udělal takto.

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

Vložte výše uvedený kód do souboru a pojmenujte jej jako script.py. Spusťte skript proti souboru, který chcete zkontrolovat.

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

Příklad:

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

Komentáře

  • ''.join(list(open("/path/to/file"))[1:-1]): Zdá se, že jde o jednodušší řešení 🙂 A pokud to potřebujete udělat přímo na příkazovém řádku, můžete zkusit: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *