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
Antworten:
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:
Pure Bash:
$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file example. line. file.
quelle
$NF
"?##
oder probiere es einfach in der Shell aus.Sie können es einfach mit grep tun:
grep -oE '[^ ]+$' file
(
-E
Verwenden Sie den erweiterten regulären Ausdruck.-o
Geben Sie nur den übereinstimmenden Text anstelle der vollständigen Zeile aus.)quelle
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:]]+$'
Sie können so etwas in awk tun:
awk '{ print $NF }'
Bearbeiten: Um Leerzeilen zu vermeiden:
awk 'NF{ print $NF }'
quelle
Eine andere Möglichkeit, dies in Plain Bash zu tun, besteht darin, den folgenden
rev
Befehl 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
Leerzeichen als Trennzeichen, nehmen das erste Feld, dascut
erzeugt wird, und kehren das Token dann erneut umtr -d
, löschen unerwünschte Zeichen undtr
ersetzen 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" ","
quelle
es gibt viele Wege. Wie
awk
Lösungen zeigen, ist es die saubere LösungDie 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
sed
und für einewhile
Schleife 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
quelle
tldr;
$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'
Für eine Datei wie diese
Der angegebene Befehl wird gedruckt
Wie es funktioniert:
awk '{print $NF}'
: druckt das letzte Feld jeder Zeilepaste -sd,
: lieststdin
seriell (jeweils-s
eine Datei) und schreibt durch Kommas getrennte Felder (-d,
)sed 's/,/, /g'
:s
ubstitutes","
mit", "
g
lobally (für alle Fälle)Verweise:
quelle