linux 我如何用bash得到每行的最后一个词

eqfvzcg8  于 12个月前  发布在  Linux
关注(0)|答案(8)|浏览(107)

例如,我有一个文件:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

我需要:

example, line, file

我的意思是“awk”,但问题是,这些话是在不同的空间

wydwbb8l

wydwbb8l1#

在普通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" ","
kgqe7b3p

kgqe7b3p2#

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's在全局上用", "g替换","(适用于所有示例)

参考文献:

byqmnocz

byqmnocz3#

有很多种方法。正如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

这叫做参数展开

k10s72fa

k10s72fa4#

如果你想启动一个perl的一行程序作为最后一个单词:
perl -lane 'print "$F[-1]"'
.其中-a自动分割为@F$F[-1]是最后一个元素。
转换成带逗号的列表:
perl -ane 'print "$F[-1]" . (eof() ? "\n":",")'

hts6caw3

hts6caw35#

上面的都不适合我,下面的是:

grep -o '\S*$' file
whlutmcx

whlutmcx6#

尝试

$ 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,

纯bash:

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

wyyhbhjk7#

你可以用grep轻松实现:

grep -oE '[^ ]+$' file

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

0qx6xfy6

0qx6xfy68#

你可以在awk中这样做:

awk '{ print $NF }'

编辑:为了避免空行:

awk 'NF{ print $NF }'

相关问题