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

3

我有一个文件的格式像这样:

First Last UID
First Middle Last UID

基本上,有些姓名包含中间名(有时甚至有多个中间名)。我只需要一个只包含UID的文件。

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

2个回答

6

awk

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

最后一个字段可以使用NF变量进行索引,该变量包含每行的字段数。我们使用美元符号进行索引,生成的一行代码很容易。

awk '{ print $NF }' file

rs, cat和tail

另一种方法是将文件内容转置,然后抓取最后一行并再次转置(这很容易理解)。

得到的管道是:

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

cut & rev

使用rev,我们也可以通过反转行、剪切第一个字段,然后再次反转来实现此目标。

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

sed

使用 ,我们可以通过 ^.* [^ ]*$ 简单地删除直到空格的所有字符。这个正则表达式意味着匹配行的开头 ^,后跟任何字符序列 .* 和一个空格 。其余部分是一系列非空格字符 [^ ]* 直到行尾 $。sed 单行命令如下:

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

我们捕获最后一部分(在\(\)之间)并将其替换回整行。 \1表示捕获的第一组,即最后一个字段。

注释

  1. 正如Ed Norton巧妙地指出的那样,我们可以简单地不捕获该组并删除正则表达式的前面部分。这可以像下面这样轻松实现:

    sed 's/.* //' file

    这是非常简单和优雅的方法。

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


2
在sed中,你只需要使用sed 's/.* //' - Ed Morton
1
当然,谢谢您的输入,我应该看到那个的。 - ShellFish

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

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


是的,grep 是个很好的解决方案! - ShellFish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接