98

例如我有一个文件:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

我需要:

example, line, file

我打算用“awk”,但问题是这些词在不同的空间

4

6 回答 6

104

尝试

$ awk 'NF>1{print $NF}' file
example.
line.
file.

要在您的示例中的一行中获得结果,请尝试:

{
    sub(/\./, ",", $NF)
    str = str$NF
}
END { print str }

输出:

$ awk -f script.awk file
example, line, file, 

纯重击:

$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.
于 2013-05-17T20:05:46.387 回答
93

您可以使用 grep 轻松完成:

grep -oE '[^ ]+$' file

-E使用扩展的正则表达式;-o只输出匹配的文本而不是整行)

于 2013-05-18T05:05:48.053 回答
44

您可以在 awk 中执行以下操作:

awk '{ print $NF }'

编辑:为了避免空行:

awk 'NF{ print $NF }'
于 2013-05-17T20:05:00.647 回答
16

在普通 bash 中执行此操作的另一种方法是使用如下rev命令:

cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","

基本上,您反转文件的行,然后cut使用空格作为分隔符将它们拆分,获取第一个cut产生的字段,然后再次反转令牌,用于tr -d删除不需要的字符并tr再次将换行符替换为,

此外,您可以通过以下方式避免第一只猫:

rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
于 2013-05-18T00:09:01.563 回答
9

tldr;

$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'

对于这样的文件

$ cat file.txt
The quick brown fox
jumps over
the lazy dog.

给定的命令将打印

fox, over, dog.

这个怎么运作:

  • awk '{print $NF}': 打印每一行的最后一个字段
  • paste -sd,stdin:串行读取( -s, 一次一个文件) 并写入以逗号分隔的字段 ( -d,)
  • sed 's/,/, /g':用slobally代替(适用于所有情况)","", " g

参考:

于 2016-03-16T17:50:36.030 回答
8

有很多方法。如awk解决方案所示,这是干净的解决方案

sed 解决方案是删除任何内容,直到最后一个空格。所以如果最后没有空间,它应该可以工作

sed 's/.* //g' <file>

您也可以避免sed并进行while循环。

while read line
do [ -z "$line" ] && continue ;
echo $line|rev|cut -f1 -d' '|rev
done < file

它读取一行,尊重它,剪切第一个(即原始的最后一个)并恢复

可以以纯 bash 方式完成相同的操作

while read line
do [ -z "$line" ] && continue ;
echo ${line##* }
done < file

称为参数扩展

于 2013-05-17T20:26:40.723 回答