【问题标题】:Add numbers to the beginning of every line in a file将数字添加到文件中每一行的开头
【发布时间】:2012-01-02 15:08:15
【问题描述】:

如何在文件的每一行开头添加数字?

例如:

这是 文本 从文件中。

变成:

000000001 这是 000000002 正文 000000003 来自文件。

【问题讨论】:

    标签: bash row-number


    【解决方案1】:

    cat -n thefile 将完成这项工作,尽管数字格式略有不同。

    【讨论】:

      【解决方案2】:

      不要使用 cat 或任何其他非为此而设计的工具。使用程序:

      nl - 文件行数

      例子:

      $ nl --number-format=rz --number-width=9 foobar
      $ nl -n rz -w 9 foobar # short-hand
      

      因为 nl 是为此而生的 ;-)

      【讨论】:

      • ls | nl #nl for dummies
      • nl 在所有情况下都没有真正的帮助。见下文: $ cat test123 123 sd $ nl test123 1 123 2 sd $ awk '{print NR,$0}' test123 1 123 2 3 sd
      • 在读取 EOF 之前它不会输出行。所以你不能用它来对一个长时间运行的在线程序的输出进行编号。
      • @egorulz 使用-ba 开关。
      【解决方案3】:

      您正在寻找nl(1) 命令:

      $ nl -nrz -w9  /etc/passwd
      000000001   root:x:0:0:root:/root:/bin/bash
      000000002   daemon:x:1:1:daemon:/usr/sbin:/bin/sh
      000000003   bin:x:2:2:bin:/bin:/bin/sh
      ...
      

      -w9 要求输入九位数字; -nrz 要求将数字格式化为右对齐并使用零填充。

      【讨论】:

      • 这是准确的答案,也是一个很好的答案,但对于家庭作业式的问题,提供提示、链接或更通用的解决方案可能会更好。
      • @Raymond,确实如此,但我没有看到任何迹象表明这是家庭作业。简单的?当然。但是在这些方面有大量的文本处理实用程序,即使是经验丰富的开发人员也从未了解过。
      • @Raymond:我建议取消删除您的答案,我喜欢它。不同的工具可能因不同的原因而表现出色,awk(1) 肯定擅长此类任务。
      • 这不是家庭作业。我只是想,我可能需要 2 个小时才能弄清楚如何在 awk 中做到这一点,使用一些 for 循环,这将需要另外 30 分钟的脚本来运行文件;或者我可以在这里问。我以前从未听说过nl。我是否发布了错误的问题?
      • Village:完全没有——Stack Overflow 旨在回答所有级别的问题。 @Raymond 刚刚注意到您在短时间内提出了三个问题,要求您解决类似于教授可能在“学习 Unix”课程中布置的家庭作业的问题。一个人听起来像是在寻找问题的解决方案,但三者加在一起让我们怀疑我们是否正在为你做功课。 :)
      【解决方案4】:

      AWK 的 printfNR$0 可以轻松地对格式进行精确灵活的控制:

      ~ $ awk '{printf("%010d %s\n", NR, $0)}' example.txt
      0000000001 This is
      0000000002 the text
      0000000003 from the file.
      

      【讨论】:

      • 太棒了!我需要它来填充大量静态 int 声明,所以我有类似 public static final int CONSTANTX; 的东西,我想要类似 public static final int CONSTANTX;=X 的东西,其中 X 是源文件中的行号。我将您的答案重新排列为awk '{printf("%s = %d;\n", $0, NR-4)}' Constants.java,它就像一个魅力!
      【解决方案5】:
      perl -pe 'printf "%09u ", $.' -- example.txt
      

      【讨论】:

        【解决方案6】:

        这里有一个 bash 脚本也可以做到这一点:

        #!/bin/bash
        counter=0
        filename=$1
        while read -r line
        do
          printf "%010d %s" $counter $line
          let counter=$counter+1
        done < "$filename"
        

        【讨论】:

          【解决方案7】:

          最简单、最简单的选择是

          awk '{print NR,$0}' file
          

          请参阅上面的评论,了解为什么 nl 并不是真正的最佳选择。

          【讨论】:

            猜你喜欢
            • 2018-02-05
            • 2019-09-11
            • 1970-01-01
            • 2015-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多