如何把序列号在重复数据的一行结束了吗?(How to put sequential numbers

2019-10-30 11:54发布

我有一些重复信息的文件。 这些线被编号,后面跟着冒号,然后是信息。 我想提出一个序列号只在重复信息的末尾。

例。

输入:

1:Jose da Silva
2:Jose da Silva
3:Fulano de Tal
4:Jose da Silva
5:Sicrano Pereira
6:Ze Ruela
7:Sicrano Pereira
8:Jose da Silva

输出:

1:Jose da Silva #1
2:Jose da Silva #2
3:Fulano de Tal
4:Jose da Silva #3
5:Sicrano Pereira #1
6:Ze Ruela
7:Sicrano Pereira #2
8:Jose da Silva #4

[这个问题不同于这一个因为这里的线是不同的永诺(每行具有不同的数目)。 我的输入/输出的例子可能看起来非常相似,但在实际应用中,他们都没有。]

Answer 1:

调整我以前的答案 :

awk -F: 'FNR==NR {count[$2]++; next}
         count[$2]>1 {$0=$0 OFS "#"++times[$2]}
         1' file file

那就是:在第一时间,计算每个第二块出现的次数。 第二次,保持附加一个递增的数字给那些出现不止一次。 因此,而不是比较全线飘红,它比较第二场,这是从结肠的一切:

进一步的解释:

  • FNR==NR {actions; next} {more_actions} file1 file2 FNR==NR {actions; next} {more_actions} file1 file2在于做一些东西actions读取第一个文件,其他时候more_actions读第二个时。 当你想比较的文件,就像我们在这里做这都非常方便。 别急,这里我们只有一个文件,对不对? 是的,不过这也让文件的一种彼此比较线。 有关这更多信息惯用的awk 。
  • 所以FNR==NR {count[$2]++; next} FNR==NR {count[$2]++; next}阵列中存储count每2场出现了多少次。 这样一来,何塞·达席尔瓦是计数器4倍,等等。请注意,我们使用$2作为数组的索引:这是一款基于分隔符的第二场:我们设置与-F: 也就是说,第一场就是一切到第一: ,第二场一切从第一:达到第二个等。
  • count[$2]>1 {$0=$0 OFS "#"++times[$2]}噻SIS已经读取第二次的文件。 这不断检查,如果对当前时间的第二场柜台说,它发生一次或多次。 如果不止一次,把它添加到原字符串$0一些内容。 这是OFS "#"++times[$2]
    • OFS是输出字段分隔符。 即,打印数据时,所使用的字段分隔符。 由于我们没有在运行程序之前设置它,它默认为一个空格。
    • "#"这仅仅是我们想要的柜台前添加一些文字。
    • ++times[$2]这只是跟踪它多少次到目前为止打印的计数器。 因为我们有不同的第二场,我们需要一个数组times[]以跟踪它们中的每一个。
  • 1在脚本的最后,我们有这个1 。 这是为了打印一行的惯用的方法: 1是一个真值和awk的行为当表达式为真是打印当前行。 也就是说,打印$0可以是原始一个或一个与一些尾随新的内容。

输出:

$ awk -F: 'FNR==NR {count[$2]++; next} count[$2]>1 {$0=$0 OFS "#"++times[$2]}1' file file
1:Jose da Silva #1
2:Jose da Silva #2
3:Fulano de Tal
4:Jose da Silva #3
5:Sicrano Pereira #1
6:Ze Ruela
7:Sicrano Pereira #2
8:Jose da Silva #4


文章来源: How to put sequential numbers at the end of repeated data in a line?