2016-11-19 61 views
1

我的文本文件将作为阅读:添加行号重复的行

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 

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

我只是不知道如何通过基于重复条目编号行。

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

+0

将当前行保存在变量中。如果当前行等于变量,则递增计数器,否则将其重新设置为1. – Barmar

+0

输入文件中的重复行是否始终在一起? – Barmar

回答

5
$ awk -v OFS=',' '{print ++cnt[$0], $0}' file 
1,111 
2,111 
1,222 
2,222 
3,222 
1,333 
2,333 
1

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

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

Perl的解决方案:

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

我明白其余的,但'处理换行符'是什么意思?处理它们如何? –

+1

@EdMorton:详情参见[perlrun](http://p3rl.org/perlrun):它从输入中删除换行符,并将它们添加到输出中。 – choroba

+0

我读过它但对我来说没有意义,我只是不明白从输入中删除换行符然后将它们添加回输出或为什么要这样做会意味着什么。哦,谢谢你的参考。 –

0
  1. 软件工具的方法,给定文本文件作为输入:

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

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

输出(的任一方法):

1 
2 
1 
2 
3 
1 
2