Is er een eenvoudige manier om een bestand te echoën door de eerste en laatste regels over te slaan? Ik was aan het kijken naar piping van head
naar tail
, maar voor hen lijkt het erop dat ik van meet af aan het totale aantal regels moet weten. Ik keek ook naar split
, maar ik zie ook geen manier om het daarmee te doen.
Antwoord
Alleen met sed
, zonder leidingen:
sed "1d;$d" file.txt
OPMERKING
-
1
bedoel eerst regel -
d
betekenen verwijderen -
;
is het scheidingsteken voor 2 commandos -
$
gemiddelde laatste regel
Answer
U hoeft het aantal regels van tevoren niet te weten. tail
en head
kunnen respectievelijk een afwijking aan het begin of einde van het bestand nemen.
Deze pipe begint om de tweede regel van het bestand (de eerste regel overslaan) en stopt bij de voorlaatste (de laatste regel overslaan). Om meer dan één regel aan het begin of einde over te slaan, past u de getallen dienovereenkomstig aan.
tail -n +2 file.txt | head -n -1
als u het andersom doet, werkt het natuurlijk hetzelfde:
head -n -1 file.txt | tail -n +2
Reacties
Antwoord
Hier is hoe het te doen met awk
:
awk "NR>2 {print t} {t=$0}"
Ook een andere manier voor sed
:
sed "1d;x" file.txt
x
is geavanceerd sed
commando, schakelt de huidige regel met de vorige: stroom gaat in de buffer en vorige s gaat naar het scherm enzovoort, terwijl sed
de stroom regel voor regel verwerkt (dit is waarom de eerste regel leeg blijft).
awk
oplossing voor elke stap (regel) plaatst de huidige regel in de variabele en begint deze pas af te drukken nadat de tweede regel is gepasseerd. Zo kregen we een shitfed reeks regels op het scherm van de voorlaatste tot de voorlaatste. De laatste regel wordt weggelaten omdat de regel in de variabele staat en alleen bij de volgende stap moet worden afgedrukt, maar alle stappen zijn al op en we zien de regel nooit op het scherm.
Hetzelfde idee in de perl
:
perl -ne "print $t if $.>2 ; $t=$_" file.txt
$.
staat voor regelnummer en $_
voor huidige regel.
perl -n
is een snelkoppeling voor while(<..>) {..}
structuur en -e
is voor inline script.
Antwoord
Voor Mac-gebruikers:
Op Mac: head -n -1
werkt niet. Keer in plaats daarvan het bestand om, hak de eerste regel af en keer het terug:
tail -r file.txt | tail -n +2 | tail -r
Uitleg:
-
tail -r
: keert de volgorde van de regels in de invoer om -
tail -n +2
: drukt alle l ines vanaf de tweede regel in zijn invoer
Reacties
- Het zou mislukken met
head: illegal line count -- -1
om precies te zijn.
Antwoord
In Python zou ik dit graag doen.
#!/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]))
Plak de bovenstaande code in een bestand en noem het script.py
. Voer het script uit voor het bestand waarmee u wilt controleren.
python3 script.py /path/to/the/file
Voorbeeld:
$ cat file foo apple banana bar $ python3 script.py file apple banana
Reacties
-
''.join(list(open("/path/to/file"))[1:-1])
: Dit lijkt een eenvoudigere oplossing te zijn 🙂 En als het nodig is om dit rechtstreeks op de opdrachtprompt te doen, dan zou je kunnen proberen:python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'
head -n -1
verwijdert de eerste EN de laatste regel van mijn.txt
-bestand op Ubuntu 14.04.2LTS.head -n -1
zegthead: illegal line count -- -1
head -n -1
werkt met GNU coreutils, misschien heeft MacOS een BSD-variant?