2016-05-19 33 views
0

我有一个重复信息的文件。这些行被编号,后跟一个冒号,后面跟着信息。我只想在重复信息的末尾添加一个序列号。如何将连续数字放在一行中重复数据的末尾?

例子。

输入:

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 

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

+0

这是你的另一个问题的重复数据删除时,微小的变化并不保证一个新的问题 – 123

+0

我害怕社会的这样认为。我认为这是一个不同的问题。但很抱歉。我应该删除其他问题吗? – meleu

+1

做你想做的,我不是警察。 – 123

回答

1

调整my previous answer

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包括在读第二个读数时,第一个文件和其他more_actions时做一些东西actions。当你想比较文件时,这非常方便,就像我们在这里做的那样。但是等一下,这里我们只有一个文件,对吧?是的,但这也可以将文件中的行彼此进行比较。更多关于这个的信息在Idiomatic awk
  • 所以FNR==NR {count[$2]++; next}存储在数组中count每隔第2个字段出现多少次。这样,Jose da Silva会计数4次,等等。注意我们使用$2作为数组的索引:这是基于我们用-F:设置的分隔符:的第二个字段。也就是说,第一个领域是第一个到第一个:,第二个领域从第一个:到第二个等等。
  • count[$2]>1 {$0=$0 OFS "#"++times[$2]} thi 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 
+0

我在脚本上使用了你的代码片段,并给了你应得的荣誉。看看:https://github.com/meleu/RetroPie-input-selection/blob/master/input_selection.sh – meleu

+0

如果你想要引用其他的话,请告诉我(也许你的网站/博客/等等。 )。 – meleu

+0

@meleu这真是太好了!我在那里看到很好的代码,做得很好。我已编辑,以添加脚本的进一步解释。 – fedorqui

相关问题