How do I get the last word in each line with bash

前端 未结 6 1375
我在风中等你
我在风中等你 2020-12-07 22:35

For example i have a file:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

and i need:

         


        
相关标签:
6条回答
  • 2020-12-07 22:50

    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" ","
    
    0 讨论(0)
  • 2020-12-07 22:51

    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.
    
    0 讨论(0)
  • 2020-12-07 22:58

    there are many ways. as awk solutions shows, it's the clean solution

    sed solution is to delete anything till the last space. So if there is no space at the end, it should work

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

    you can avoid sed also and go for a while loop.

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

    it reads a line, reveres it, cuts the first (i.e. last in the original) and restores back

    the same can be done in a pure bash way

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

    it is called parameter expansion

    0 讨论(0)
  • 2020-12-07 23:04

    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, : reads stdin serially (-s, one file at a time) and writes fields comma-delimited (-d,)
    • sed 's/,/, /g' : substitutes "," with ", " globally (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
    0 讨论(0)
  • 2020-12-07 23:08

    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)

    0 讨论(0)
  • 2020-12-07 23:13

    You can do something like this in awk:

    awk '{ print $NF }'
    

    Edit: To avoid empty line :

    awk 'NF{ print $NF }'
    
    0 讨论(0)
提交回复
热议问题