How do I get the last word in each line with bash
Try
$ awk 'NF>1{print $NF}' file
example.
line.
file.
To get the result in one line as in your example, try:
{
sub(/\./, ",", $NF)
str = str$NF
}
END { print str }
output:
$ awk -f script.awk file
example, line, file,
Pure bash:
$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.
You can do it easily with grep:
grep -oE '[^ ]+$' file
(-E
use extended regex; -o
output only the matched text instead of the full line)
You can do something like this in awk:
awk '{ print $NF }'
Edit: To avoid empty line :
awk 'NF{ print $NF }'
Another way of doing this in plain bash is making use of the rev
command like this:
cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
Basically, you reverse the lines of the file, then split them with cut
using space as the delimiter, take the first field that cut
produces and then you reverse the token again, use tr -d
to delete unwanted chars and tr
again to replace newline chars with ,
Also, you can avoid the first cat by doing:
rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
tldr;
$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'
For a file like this
$ cat file.txt
The quick brown fox
jumps over
the lazy dog.
the given command will print
fox, over, dog.
How it works:
-
awk '{print $NF}'
: prints the last field of every line -
paste -sd,
: readsstdin
serially (-s
, one file at a time) and writes fields comma-delimited (-d,
) -
sed 's/,/, /g'
:s
ubstitutes","
with", "
g
lobally (for all instances)
References:
- https://linux.die.net/man/1/awk
- https://linux.die.net/man/1/paste
- https://linux.die.net/man/1/sed