Löschen Sie die letzten n Zeichen aus den Zeilen innerhalb der Datei

Löschen Sie die letzten n Zeichen aus den Zeilen innerhalb der Datei

Ich verwende ein Mac-Terminal (Bash) und habe eine Datei mit dem Namen , die folgende Zeilen data_list.txtenthält :n

aaabbbccc_7777.txt 
nnhhaa_8888.txt 
ayquabay_9999.txt 
ayqynbnbn_1122.txt 
ooppaa_3454.txt

Wie kann ich die letzten 8 Zeichen jeder Zeile entfernen?

Erwartete Ausgabe von data_list.txt:

aaabbbccc_ 
nnhhaa_ 
ayquabay_ 
ayqynbnbn_ 
ooppaa_

Vielen Dank für jede Hilfe

Antwort1

Wenn Sie die letzten 8 Zeichen oder alle (wenn es weniger als 8 sind) löschen möchten, können Sie Folgendes tun:

sed "s/.\{0,8\}$//; /^$/d" data_list.txt

Erweiterte reguläre Ausdrücke sind nicht erforderlich. Dadurch werden so viele Zeichen wie möglich gelöscht, jedoch nicht mehr als 8. Wenn eine leere Zeile übrig bleibt, wird sie aus der Ausgabe entfernt.

Wenn Sie nachstehende Leerzeichen löschen müssen (ohne sie in die 8 Zeichen einzuschließen), können Sie Folgendes tun:

sed "s/.\{0,8\}[[:space:]]*$//" data_list.txt

Ich kann nur raten, was die tatsächliche Bedingung dafür ist, was am Ende entfernt werden soll (z. B. alles nach dem Unterstrich oder eine Zahl + die Erweiterung), aber wenn Sie die Dateierweiterung und alle Ziffern davor entfernen möchten:

sed "s/[[:digit:]]*\..*$//" data_list.txt

In anderen Antworten wurde bereits gezeigt, wie alles nach dem Unterstrich entfernt wird. Daher werde ich das nicht wiederholen.

Antwort2

Für Ihre genaue Eingabe (alle Zeilen haben am Ende Leerzeichen, außer der letzten Zeile) können Sie Folgendes verwenden (ich nehme an, Sie möchten den „after _ part“ loswerden):

sed 's/........ *$//' data_list.txt

Um alles nach dem letzten Unterstrich zu entfernen, verwenden Sie Folgendes:

sed 's/\(.*_\).*$/\1/' data_list.txt

Es funktioniert auch bei Zeilen mit mehreren Unterstrichen, da sed „gierig“ ist. Obwohl ich nicht weiß, ob dies unter MacOS funktioniert, ist es zumindest für Linux-Sed-Benutzer nützlich, dass die Google-Suchmaschine hier landet ...

Antwort3

Hier ist eine awkLösung, die genauso schnell ist wie Frippes sedAnsatz, anhand einer Beispieldatei mit 100.000 Zeilen:

time awk '{print substr($0, 1, length($0)-8)}' 100k.txt

real    0m4.110s
user    0m0.142s
sys     0m0.422s

time sed "s/.\{0,8\}$//; /^$/d" 100k.txt

real    0m4.043s
user    0m1.558s
sys     0m0.345s

Durch eine beliebige Zahl ersetzen 8. Der Hauptunterschied besteht darin, dass awkeine neue Zeile gedruckt wird, wenn Ihre Schnittlänge die Zeilenlänge überschreitet, während seddies nicht der Fall ist.

Antwort4

Verwenden von Raku (früher bekannt als Perl_6)

raku -ne '.trim-trailing.chop(8).put;'

ODER

raku -pe '.=trim-trailing; .=chop(8);'

Beispieleingabe:

wxxyyyzzzz_1234.txt
aaabbbccc_7777.txt 
nnhhaa_8888.txt 
ayquabay_9999.txt 
ayqynbnbn_1122.txt 
ooppaa_3454.txt

Beispielausgabe:

wxxyyyzzzz_
aaabbbccc_
nnhhaa_
ayquabay_
ayqynbnbn_
ooppaa_

Beachten Sie, dass beide Antworten oben Rakus trim-trailingRoutine verwenden, um nachstehende Leerzeichen zu entfernen. Sie können die Anzahl der Zeichen vom rechten Ende der Zeichenfolge löschen trim-trailingund/oder anpassen .chop

https://docs.raku.org/routine/chop
https://raku.org

verwandte Informationen