Wie bekomme ich das letzte Wort in jeder Zeile mit Bash

79

Zum Beispiel habe ich eine Datei:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

und ich brauche:

example, line, file

Ich beabsichtige mit "awk", aber das Problem ist, dass die Wörter in einem anderen Raum sind

camilo soto
quelle
1
Ihre "zweite Zeile" befindet sich aufgrund der leeren Zeilen nicht in der zweiten Zeile. Bitte geben Sie in Zukunft weniger mehrdeutige Beispiele an.
Adrian Frühwirth

Antworten:

91

Versuchen

$ awk 'NF>1{print $NF}' file
example.
line.
file.

Versuchen Sie Folgendes, um das Ergebnis wie in Ihrem Beispiel in einer Zeile zu erhalten:

{
    sub(/\./, ",", $NF)
    str = str$NF
}
END { print str }

Ausgabe:

$ awk -f script.awk file
example, line, file, 

Pure Bash:

$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.
Fredrik Pihl
quelle
@Fredrik Pihl, könnten Sie jedem Codeabschnitt Erklärungen hinzufügen, wie zum Beispiel: "Dieser Code druckt das letzte von awk empfangene Feld durch Drucken $NF"?
Alexej Magura
Könntest du echo $ {line ## *} erklären?
Code4Cause
1
@ code4cause - gehe einfach zu gnu.org/software/bash/manual/bash.html und suche ##oder probiere es einfach in der Shell aus.
Fredrik Pihl
Gibt nichts zurück, wenn es nur ein Wort gibt. $ echo "foo" | awk 'NF> 1 {print $ NF}' $
Ethan Post
85

Sie können es einfach mit grep tun:

grep -oE '[^ ]+$' file

( -EVerwenden Sie den erweiterten regulären Ausdruck. -oGeben Sie nur den übereinstimmenden Text anstelle der vollständigen Zeile aus.)

Rici
quelle
3
Es sollte sein grep -oE '[^ ]+$', dass Sie die Registerkarte aufgrund des Browserverhaltens hier sehen möchten, aber auf jeden Fall sollten Sie auch Registerkarten berücksichtigen, oder besser nochgrep -oE '[^[:space:]]+$'
Nabil Kadimi,
32

Sie können so etwas in awk tun:

awk '{ print $NF }'

Bearbeiten: Um Leerzeilen zu vermeiden:

awk 'NF{ print $NF }'
Hal Canary
quelle
1
Das würde auch die leeren Zeilen drucken
Fredrik Pihl
12

Eine andere Möglichkeit, dies in Plain Bash zu tun, besteht darin, den folgenden revBefehl zu verwenden:

cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","

Grundsätzlich kehren Sie die Zeilen der Datei um, teilen sie dann mit cutLeerzeichen als Trennzeichen, nehmen das erste Feld, das cuterzeugt wird, und kehren das Token dann erneut um tr -d, löschen unerwünschte Zeichen und trersetzen erneut Zeilenumbrüche durch,

Sie können die erste Katze auch vermeiden, indem Sie Folgendes tun:

rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
Higuaro
quelle
Dies ist eine viel einfachere Lösung! Ich schätze das Denken!
Sohail Saha
6

es gibt viele Wege. Wie awkLösungen zeigen, ist es die saubere Lösung

Die Lösung besteht darin, alles bis zum letzten Leerzeichen zu löschen. Wenn am Ende kein Platz mehr vorhanden ist, sollte es funktionieren

sed 's/.* //g' <file>

Sie können auch vermeiden sedund für eine whileSchleife gehen.

while read line
do [ -z "$line" ] && continue ;
echo $line|rev|cut -f1 -d' '|rev
done < file

es liest eine Zeile, verehrt sie, schneidet die erste (dh die letzte im Original) und stellt sie wieder her

das gleiche kann auf reine Bash-Art gemacht werden

while read line
do [ -z "$line" ] && continue ;
echo ${line##* }
done < file

es wird Parametererweiterung genannt

abasu
quelle
6

tldr;

$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'

Für eine Datei wie diese

$ cat file.txt
The quick brown fox
jumps over
the lazy dog.

Der angegebene Befehl wird gedruckt

fox, over, dog.

Wie es funktioniert:

  • awk '{print $NF}' : druckt das letzte Feld jeder Zeile
  • paste -sd,: liest stdinseriell (jeweils -seine Datei) und schreibt durch Kommas getrennte Felder ( -d,)
  • sed 's/,/, /g': substitutes ","mit ", " globally (für alle Fälle)

Verweise:

Rubicks
quelle
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert erheblich verbessern. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen.
Toby Speight