bash,文本文件删除最后一个空格前每行的所有文本

use*_*171 3 bash awk space sed

我有一个文件格式如下:

First Last UID
First Middle Last UID
Run Code Online (Sandbox Code Playgroud)

基本上,一些名称具有中间名称(有时多于一个中间名称).我只想要一个只作为UID的文件.

是否有可以运行的sed或awk命令在最后一个空格之前删除所有内容?

She*_*ish 6

AWK

使用打印每行的最后一个字段.

使用NF包含每行的字段数的变量索引最后一个字段.我们使用美元符号对其进行索引,因此生成的单行程很容易.

awk '{ print $NF }' file
Run Code Online (Sandbox Code Playgroud)

rs,cat&tail

另一种方法是转置文件的内容,然后抓住最后一行并再次转置(这很容易看到).

生成的管道是:

cat file | rs -T | tail -n1 | rs -T
Run Code Online (Sandbox Code Playgroud)

切割和转速

使用,rev我们也可以通过反转线条,切割第一个区域然后再次反转来实现这一目标.

rev file | cut -d ' ' -f1 | rev
Run Code Online (Sandbox Code Playgroud)

SED

使用我们只需删除所有字符,直到找到 的空格^.* [^ ]*$.这个正则表达式意味着匹配行的开头^,然后是任何字符序列.*和空格. The rest is a sequence of non spaces [^ ]*直到行尾$.sed one-liner是:

sed 's/^.* \([^ ]*\)$/\1/' file
Run Code Online (Sandbox Code Playgroud)

我们在那里拍摄的最后一部分(之间\(\))和次回在整条生产线.\1表示第一个捕获的组,这是最后一个字段.

笔记

  1. 正如Ed Norton巧妙地指出的那样,我们可能根本无法抓住该组并删除正则表达式的前一部分.这可以很容易实现

    sed 's/.* //' file

    这显然不那么复杂,更优雅.

  2. 有关更多信息,请参阅man sedman awk.

  • 在sed中,你需要的是`sed's /.*//'`. (2认同)