【问题标题】:Extract last word of a file in bash/sed/awk在 bash/sed/awk 中提取文件的最后一个单词
【发布时间】:2014-08-01 07:17:15
【问题描述】:

我想在 bash/sed/awk 中提取文件的最后一个字,例如 a.txt

我该怎么做?

【问题讨论】:

    标签: bash file awk sed


    【解决方案1】:

    要获取最后一行的最后一个单词:

    awk 'END {print $NF}' file
    

    【讨论】:

      【解决方案2】:

      已更新。

      如果您想使用awk 并确保有一个单词,请使用:

      tac a.txt | awk 'NF{print $NF; exit}'
      

      tac 反向打印文件。 {} 块前面的 NF 使其在该行不为空时起作用。在这种情况下,它会打印最后一个字段(NF 代表字段数,因此$NF 是最后一个),然后退出。

      测试

      $ cat a
      hello my name
      is blabla
      and this is
      my comment.
                            <--- note an empty line
      $ tac a | awk 'NF{print $NF; exit}'
      comment.
      

      或者也如suggested by Kent:

      awk '{w=NF?$NF:w} END{print w}' file
      

      w=$NF?$NF:w。这是一个三元运算符:如果NF&gt;0(没有空行),则将w 设置为最后一个字段。否则,保持原样。最后,在END{} 中,打印最后保存的单词。


      如果你想用sed 来制作它,你可以使用它,以防最后没有空行:

      sed -n '${s/.* //; p}' a.txt
      

      说明

      • $ 代表文件的最后一行。在这种情况下,请执行 {} 中的内容。
      • s/.* //; p 删除直到最后一个空格的所有内容。然后打印p

      【讨论】:

      • 我猜他想要awk 'END{print $NF}' file 这样的东西,我说like,因为文件的最后一行可能是空的。既然你是第一个来的,你可以做一些修复并完成答案。
      • Err 是真的,我确实理解错了。 Jotne 现在发布了他的答案,所以我将删除我的答案。
      • 正如我所说,awk 'END{print $NF}' file 并不总是有效。
      • +1 因为OP说没有空行,所以要容易得多。 ,我只想评论awk '{w=$NF?$NF:w}END{print w}' file
      • s/.* //; p 很好,除非行以空格结尾。我建议s/.* \([[:space:]]\{1,\}[[:space:]]*$/\1/;p 所以事件在最后一行有 1 个单词(或没有,但这取决于确切的要求)它可以工作
      【解决方案3】:

      也试试这个 awk 命令,

      awk -v RS="\0" '{print $NF}' file
      

      RS="\0" 将文件中的所有记录转换为单个记录。然后{print $NF} 打印该单条记录的最后一个字段。

      【讨论】:

        【解决方案4】:

        你也可以使用sed命令,

        $sed -nr '${s/.* (.*)$/\1/pg}' File_name
        

        【讨论】:

        • 你应该把p放在s///的外面,否则如果最后一行没有至少2个字就会失败,在这种情况下不需要g,只有1个每行结束。最后,它失败了,最后一个位置是一个空格字符。
        【解决方案5】:

        使用 tail 和 grep :

        tail -1 myFile.txt | grep -oE '[^ ]+$'
        

        【讨论】:

          【解决方案6】:

          您还可以通过greptail 获得最后一个字:

          <a.txt grep -o '\w\+' | tail -n1
          

          【讨论】:

            【解决方案7】:

            sed 变体支持空最后一行(如果有):

            sed -n '/[^ ]/h; ${g;s/ *$//; s/.* //p}' a.txt
            

            【讨论】:

              【解决方案8】:

              这可能对你有用(GNU sed):

              sed -r '/\w/{s/.*\W(\w+)\W*$/\1/;h};$!d;x;/./!d' file
              

              将当前行的最后一个单词保存在保持空间中,然后删除该行。在文件末尾,它检索最后一个单词并将其打印出来,除非没有单词,在这种情况下它会删除空行。

              另一种方法是将整个文件 slurp 到内存中:

              sed -r ':a;$!{N;ba};s/.*\W(\w+)\W*$/\1/p;d' file
              

              【讨论】:

                【解决方案9】:
                 sed -n '/^$/!{$ s/.* \(\w*\)$/\1/p}'
                

                这将省略空行并在最后一个非空行打印最后一个单词。

                • /^$/!查找非空行
                • $ s/ 在最后一行替换
                • .* (\w*)$ 捕获 () 之间的任何内容
                • \1 替换行用于捕获组 ()
                • p 打印出来

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-02-02
                  • 2012-08-13
                  • 1970-01-01
                  • 2013-01-07
                  • 1970-01-01
                  相关资源
                  最近更新 更多