it-swarm.com.de

Wie bekomme ich das letzte Wort in jeder Zeile mit Bash

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 sich die Wörter in einem anderen Raum befinden

64
camilo soto

Versuchen

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

Um das Ergebnis in einer Zeile wie in Ihrem Beispiel zu erhalten, versuchen Sie Folgendes:

{
    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.
70
Fredrik Pihl

Mit grep geht das ganz einfach:

grep -oE '[^ ]+$' file

(-E use extended regex; -o gibt nur den passenden Text anstatt der ganzen Zeile aus)

72
rici

Sie können so etwas in awk machen:

awk '{ print $NF }'

Bearbeiten: Um Leerzeilen zu vermeiden:

awk 'NF{ print $NF }'
24
Hal Canary

Eine andere Möglichkeit, dies in plain bash zu tun, besteht darin, den Befehl rev wie folgt 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 cut auf und verwenden Leerzeichen als Trennzeichen. Nehmen Sie das erste Feld, das cut erzeugt, und kehren Sie das Token erneut mit tr -d, Um unerwünschte Zeichen zu löschen, und tr, um Zeilenumbrüche durch , Zu ersetzen.

Außerdem können Sie die erste Katze vermeiden, indem Sie Folgendes tun:

rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
10
higuaro

es gibt viele Wege. Wie awk solutions zeigt, ist es die saubere Lösung

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

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

sie können auch sed vermeiden und sich für eine while -Schleife entscheiden.

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 (d. h. die letzte im Original) und stellt sie wieder her

das gleiche kann auf eine reine bash Weise gemacht werden

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

es wird Parametererweiterung genannt

6
abasu

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 stdin seriell (-s, jeweils eine Datei) und schreibt durch Kommas getrennte Felder (-d,)
  • sed 's/,/, /g': substitutes "," mit ", "globally (für alle Instanzen)

Verweise:

5
rubicks