【问题标题】:Add line numbers for duplicate lines in a file为文件中的重复行添加行号
【发布时间】:2017-04-02 22:44:51
【问题描述】:

我的文本文件会读作:

111
111
222
222
222
333
333

我生成的文件如下所示:

1,111
2,111
1,222
2,222
3,222
1,333
2,333

或者生成的文件可能如下所示:

1
2
1
2
3
1
2

我在这里指定了一个逗号作为分隔符,但分隔符是什么并不重要 --- 我可以在将来修改它。实际上,我什至不需要原始文本文件的内容,只是行号,因为我可以将行号粘贴到原始文本文件中。

我只是不确定如何根据重复的条目对行进行编号。

列表中的所有项目至少重复一次。文件中没有单行出现。

【问题讨论】:

  • 将当前行保存在一个变量中。如果当前行等于变量,则递增计数器,否则将其设置回 1。
  • 输入文件中重复的行总是在一起吗?

标签: bash awk sed command-line data-manipulation


【解决方案1】:
$ awk -v OFS=',' '{print ++cnt[$0], $0}' file
1,111
2,111
1,222
2,222
3,222
1,333
2,333

【讨论】:

    【解决方案2】:

    使用变量保存上一行,并将其与当前行进行比较。如果它们相同,则递增计数器,否则将其设置回 1。

    awk '{if ($0 == prev) counter++; else counter = 1; prev=$0; print counter}'
    

    【讨论】:

      【解决方案3】:

      Perl 解决方案:

      perl -lne 'print ++$c{$_}' file
      
      • -n逐行读取输入
      • -l 处理换行符
      • ++$c{$_} 递增分配给哈希表 %c 中当前行 $_ 内容的值。

      【讨论】:

      • 我理解其余的,但handles newlines 是什么意思?如何处理它们?
      • @EdMorton:有关详细信息,请参阅perlrun:它从输入中删除换行符并将它们添加到输出中。
      • 我读过它,但对我来说毫无意义,我只是不明白从输入中删除换行符然后将它们添加回输出或者你为什么想要这样做意味着什么那。哦,好吧,无论如何感谢您的参考。
      • @EdMorton: 尝试运行echo $'a\nb' | perl -ne 'print length'perl -lne 来查看区别。
      • 第一次执行输出22,第二次输出错误信息Can't open print length: No such file or directory.。我在 OSX FWIW 上运行。哦,等等,我用的是-nel 而不是-len(这很重要???)。现在我得到 1 然后 1。好吧....那么 22 的长度是多少???
      【解决方案4】:
      1. 软件工具方法,给定 textfile 作为输入:

        uniq -c textfile | cut -d' ' -f7 | xargs -L 1 seq 1
        
      2. 上述基于外壳循环的变体:

        uniq -c textfile | while read a b ; do seq 1 $a ; done
        

      输出(任一方法):

      1
      2
      1
      2
      3
      1
      2
      

      【讨论】:

        猜你喜欢
        • 2015-01-12
        • 1970-01-01
        • 2020-02-05
        • 2020-01-01
        • 1970-01-01
        • 2014-07-18
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多