【问题标题】:Create final column containing row numbers in text file在文本文件中创建包含行号的最后一列
【发布时间】:2016-12-16 03:44:27
【问题描述】:

我是使用 Mac 终端的新手。我需要将制表符分隔的列添加到具有 3 个现有列的文本文件中。这些列看起来很像这样:

org1     1-20     1-40
org2     3-35     6-68
org3     16-38    40-16

等等

我需要它们看起来像这样:

org1     1-20     1-40     1
org2     3-35     6-68     2
org3     16-38    40-16     3

等等

如果这个问题已经涵盖,我深表歉意。类似问题的答案有时非常深奥,不容易转化为这种特定情况。

【问题讨论】:

  • 你想把行号放在最后一列,还是别的?
  • 在最后一栏中,是的。 :)

标签: bash macos awk sed terminal


【解决方案1】:

在 awk 中。 print 记录及其后所需的选项卡和行数:

$ awk '{print $0 "\t" NR }' foo
org1     1-20     1-40  1
org2     3-35     6-68  2
org3     16-38    40-16 3

【讨论】:

  • 非常感谢!为了将来参考,您知道在每个数字前打印一个单词的方法吗?例如“line_1、line_2、line_3 等”?
  • 只需将"\t" 替换为"\t line_"(未经测试)。
【解决方案2】:

如果要将行号添加到最后一列:

perl -i -npe 's/$/"\t$."/e' file

在哪里

  • -i 同步替换文件(删除,如果你想将结果打印到标准输出);
  • -n 使 Perl 将替换应用到文件中的每一行,就像 sed;
  • -p 打印表达式的结果;
  • -e 接受 Perl 表达式;
  • s/.../.../e 将第一部分替换为第二部分(用斜杠分隔),e 标志导致 Perl 将替换作为 Perl 表达式计算;
  • $ 是行尾锚;
  • $.变量保持当前行号

换句话说,该命令将行尾 ($) 替换为一个制表符,后跟行号 $.

【讨论】:

    【解决方案3】:

    您可以 paste 将文件放在同一文件旁边,并在前面加上行号 (nl),并删除所有其他列 (cut -f 1):

    $ paste infile <(nl infile | cut -f 1)
    org1     1-20     1-40       1
    org2     3-35     6-68       2
    org3     16-38    40-16      3
    

    &lt;(...) 构造称为process substitution,基本上允许您将命令的输出视为文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2015-06-05
      • 2018-06-24
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多