Negative Argumente zu Kopf / Schwanz

13

Varianten dieser Frage wurden sicherlich mehrmals an verschiedenen Stellen gestellt, aber ich versuche Mohne Glück , die letzten Zeilen aus einer Datei zu entfernen .

Die zweithäufigste Antwort in dieser Frage empfiehlt die folgenden Schritte, um die letzte Zeile in einer Datei zu entfernen:

head -n -1 foo.txt > temp.txt

Wenn ich das in OSX & Zsh versuche, erhalte ich jedoch:

head: illegal line count -- -1

Warum das? Wie kann ich die M letzten Zeilen und die ersten N Zeilen einer bestimmten Datei entfernen ?

Amelio Vazquez-Reina
quelle
1
Siehe POSIX Kopf und Schwanz nicht gleichwertig
Stéphane Chazelas
1
Was ist die Ausgabe von head --version? Welches System verwenden Sie?
Jofel
@jofel head --versiongibt tatsächlich einen Fehler zurück.
Amelio Vazquez-Reina

Antworten:

19

Sie können die ersten 12 Zeilen entfernen mit:

tail -n +13

(Das bedeutet, dass ab der 13. Zeile gedruckt wird.)

Einige Implementierungen von headGNU- headUnterstützung:

head -n -12

aber das ist nicht standard.

tail -r file | tail -n +12 | tail -r

würde auf jenen Systemen funktionieren, die tail -r(siehe auch GNU tac) aber suboptimal sind.

Wo nist 1:

sed '$d' file

Sie können auch:

sed '$d' file | sed '$d'

2 Zeilen zu entfernen, ist aber nicht optimal.

Du kannst tun:

sed -ne :1  -e 'N;1,12b1' -e 'P;D'

Beachten Sie jedoch, dass dies bei einigen Implementierungen nicht mit großen Werten von n funktioniert sed.

Mit awk:

awk -v n=12 'NR>n{print line[NR%n]};{line[NR%n]=$0}'

So entfernen Sie mZeilen vom Anfang und nvom Ende:

awk -v m=6 -v n=12 'NR<=m{next};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'
Stéphane Chazelas
quelle
sed 'x;1d;$d'könnte auch verwendet werden, um die letzten beiden Zeilen zu erhalten. Und w / ein paar von N's after 1dkönnten verwendet werden, um ein wenig mehr als das zu erreichen, obwohl es zu diesem Zeitpunkt keinen Vorteil gegenüber der N;P;DSchleife bietet, die Sie bereits empfehlen.
mikeserv
Danke - Der letzte Befehl ist äußerst hilfreich. Eine kleine Einschränkung im Sommer: Es funktioniert nicht, wenn moder nsind 0. Sonst wäre es perfekt.
Amelio Vazquez-Reina
2

Mit der folgenden Methode können Sie die ersten N Zeilen und die letzten M Zeilen entfernen.

Mit N=5, M=7und Datei test.txt:

sed -n -e "6,$(($(wc -l < test.txt) - 7))p" test.txt

Der Befehl druckt alle Zeilen von N + 1 bis LastLine-M.

Eine andere Option ist die Verwendung von Python:

python -c 'import sys;print "".join(sys.stdin.readlines()[5:-7]),' < test.txt
Jofel
quelle
1

Sie können die letzten M(hier M = 100) Zeilen aus einer Datei entfernen mit:

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
machen
quelle