【问题标题】:How do I get the last word in each line with bash如何使用 bash 获取每行中的最后一个单词
【发布时间】:2013-05-17 20:02:43
【问题描述】:

例如我有一个文件:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

我需要:

example, line, file

我的意图是“awk”,但问题是单词在不同的空间中

【问题讨论】:

  • 你的“第二行”由于空行不在第二行,以后请少举些模棱两可的例子。

标签: linux bash


【解决方案1】:

试试

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

【讨论】:

  • @Fredrik Pihl,您能否为每个代码部分添加解释,例如:“此代码通过打印 $NF 打印 awk 收到的最后一个字段”?
  • 你能解释一下 echo ${line##* };
  • @code4cause - 只需转到 gnu.org/software/bash/manual/bash.html 并搜索 ## 或直接在 shell 中尝试。
  • 如果只有一个单词,则不返回任何内容。 $ 回声“富”| awk 'NF>1{打印 $NF}' $
【解决方案2】:

你可以使用 grep 轻松完成:

grep -oE '[^ ]+$' file

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

【讨论】:

  • 应该是grep -oE '[^ ]+$',由于浏览器的行为,你想在这里看到标签,但无论如何,这也考虑标签空间,或者更好的是你可以做grep -oE '[^[:space:]]+$'
【解决方案3】:

你可以在 awk 中做这样的事情:

awk '{ print $NF }'

编辑:避免空行:

awk 'NF{ print $NF }'

【讨论】:

  • 这也会打印空行
【解决方案4】:

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

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

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

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

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

【讨论】:

  • 这是一个更简单的解决方案!我很欣赏这种想法!
  • @CaptainWoof "simpler" :-D 这肯定是我过去去过的地方!
【解决方案5】:

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' : substitutes ","", " globally(适用于所有情况)

参考资料:

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 此代码回答问题的额外上下文将显着改善其长期-期限价值。请edit你的答案添加一些解释。
【解决方案6】:

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

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

sed 's/.* //g' &lt;file&gt;

您也可以避免使用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-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2018-11-03
    • 2017-05-17
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多