在文本文件中创建包含行号的最终列

时间:2016-12-16 03:44:28

标签: bash macos awk sed terminal

我是使用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

如果这个问题已被涵盖,我道歉。类似问题的答案有时非常深奥,并且不容易转换到这种特定情况。

3 个答案:

答案 0 :(得分:4)

在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

答案 1 :(得分:1)

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

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

,其中

  • -i替换文件in-pace(如果要将结果打印到标准输出,请删除);
  • -n会导致Perl将替换应用于文件中的每一行,就像 sed ;
  • -p打印表达式的结果;
  • -e接受Perl表达式;
  • s/.../.../e将第一部分替换为第二部分(用斜杠分隔),e标志使Perl将替换为Perl表达式;
  • $是行尾锚点;
  • $.变量保留当前行的数量

换句话说,该命令会使用制表符后跟行号$替换行尾($.)。

答案 2 :(得分:0)

您可以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

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