我有一个文件的格式像这样:
First Last UID
First Middle Last UID
基本上,有些姓名包含中间名(有时甚至有多个中间名)。我只需要一个只包含UID的文件。
是否有sed或awk命令可以运行以删除最后一个空格之前的所有内容?
使用awk打印每行的最后一个字段。
最后一个字段可以使用NF
变量进行索引,该变量包含每行的字段数。我们使用美元符号进行索引,生成的一行代码很容易。
awk '{ print $NF }' file
另一种方法是将文件内容转置,然后抓取最后一行并再次转置(这很容易理解)。
得到的管道是:
cat file | rs -T | tail -n1 | rs -T
使用cut和rev
,我们也可以通过反转行、剪切第一个字段,然后再次反转来实现此目标。
rev file | cut -d ' ' -f1 | rev
使用 sed,我们可以通过 正则表达式 ^.* [^ ]*$
简单地删除直到空格的所有字符。这个正则表达式意味着匹配行的开头 ^
,后跟任何字符序列 .*
和一个空格 。其余部分是一系列非空格字符
[^ ]*
直到行尾 $
。sed 单行命令如下:
sed 's/^.* \([^ ]*\)$/\1/' file
我们捕获最后一部分(在\(
和\)
之间)并将其替换回整行。 \1
表示捕获的第一组,即最后一个字段。
正如Ed Norton巧妙地指出的那样,我们可以简单地不捕获该组并删除正则表达式的前面部分。这可以像下面这样轻松实现:
sed 's/.* //' file
这是非常简单和优雅的方法。
有关更多信息,请参见man sed
和man awk
。
grep
:$ grep -o '[^[:blank:]]*$' file
UID
UID
-o
告诉 grep 仅打印匹配部分。正则表达式 [^[:blank:]]*$
匹配行末的最后一个单词。
grep
是个很好的解决方案! - ShellFish
sed 's/.* //'
。 - Ed Morton