我有一个格式如下的文件:
First Last UID
First Middle Last UID
基本上,有些名字有中间名(有时候有多个中间名)。我只想要一个只作为UID的文件。
我可以运行sed或awk命令删除最后一个空格之前的所有内容吗?
答案 0 :(得分:6)
使用awk打印每行的最后一个字段。
使用NF
变量索引最后一个字段,该变量包含每行的字段数。我们使用美元符号对其进行索引,结果很简单。
awk '{ print $NF }' file
另一种方法是转置文件的内容,然后抓住最后一行并再次转置(这很容易看到)。
生成的管道是:
cat file | rs -T | tail -n1 | rs -T
使用cut和rev
,我们也可以通过反转线条,切割第一个字段然后再将其反转来实现此目标。
rev file | cut -d ' ' -f1 | rev
使用sed我们只需删除所有字符,直到找到regex ^.* [^ ]*$
的空格。此正则表达式表示匹配行^
的开头,后跟任何字符序列.*
和空格。其余的是一系列非空格
[^ ]*
,直到行$
的末尾。 sed one-liner是:
sed 's/^.* \([^ ]*\)$/\1/' file
我们捕获最后一部分(在\(
和\)
之间)并将其重新输入整行。 \1
表示第一个捕获的组,这是最后一个字段。
正如Ed Norton巧妙地指出的那样,我们根本无法抓住该组并删除正则表达式的前一部分。这可以像
一样轻松实现 sed 's/.* //' file
这显然不那么复杂,也更优雅。
有关详细信息,请参阅man sed
和man awk
。
答案 1 :(得分:1)
使用grep
:
$ grep -o '[^[:blank:]]*$' file
UID
UID
-o
告诉grep只打印匹配的部分。正则表达式[^[:blank:]]*$
匹配该行的最后一个单词。