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
-
1znamenat první řádek -
dprů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
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í:
-
tail -r: obrátí pořadí řádků v jeho vstupu -
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 -- -1abych 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]))'
head -n -1odstraní první a poslední řádek mého.txtsouboru na Ubuntu 14.04.2LTS.head -n -1říkáhead: illegal line count -- -1head -n -1pracuje s GNU coreutils, možná má MacOS nějakou variantu BSD?