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
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 -- -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]))'
head -n -1
odstraní první a poslední řádek mého.txt
souboru na Ubuntu 14.04.2LTS.head -n -1
říkáhead: illegal line count -- -1
head -n -1
pracuje s GNU coreutils, možná má MacOS nějakou variantu BSD?