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

时间:2015-06-25 23:08:36

标签: bash awk sed space

我有一个格式如下的文件:

First Last UID
First Middle Last UID

基本上,有些名字有中间名(有时候有多个中间名)。我只想要一个只作为UID的文件。

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

2 个答案:

答案 0 :(得分:6)

AWK

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

使用NF变量索引最后一个字段,该变量包含每行的字段数。我们使用美元符号对其进行索引,结果很简单。

awk '{ print $NF }' file

rs,cat&尾

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

生成的管道是:

cat file | rs -T | tail -n1 | rs -T

cut&转

使用rev,我们也可以通过反转线条,切割第一个字段然后再将其反转来实现此目标。

rev file | cut -d ' ' -f1 | rev

SED

使用我们只需删除所有字符,直到找到 ^.* [^ ]*$的空格。此正则表达式表示匹配行^的开头,后跟任何字符序列.*和空格。其余的是一系列非空格[^ ]*,直到行$的末尾。 sed one-liner是:

sed 's/^.* \([^ ]*\)$/\1/' file

我们捕获最后一部分(在\(\)之间)并将其重新输入整行。 \1表示第一个捕获的组,这是最后一个字段。

备注

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

    一样轻松实现

    sed 's/.* //' file

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

  2. 有关详细信息,请参阅man sedman awk

答案 1 :(得分:1)

使用grep

$ grep -o '[^[:blank:]]*$'  file
UID
UID

-o告诉grep只打印匹配的部分。正则表达式[^[:blank:]]*$匹配该行的最后一个单词。