【问题标题】:How to put sequential numbers at the end of repeated data in a line?如何将连续数字放在一行中重复数据的末尾?
【发布时间】:2016-05-19 08:11:23
【问题描述】:

我有一个包含一些重复信息的文件。这些行被编号,后跟一个冒号,然后是信息。我只想在重复信息的末尾放一个序号。

示例。

输入:

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 不同,因为这里的行总是不同的(每行都有不同的数字)。我的输入/输出示例可能看起来非常相似,但在实际应用中却并非如此。]

【问题讨论】:

  • 这是你的另一个问题的欺骗,微小的变化并不保证一个新的问题
  • 我害怕社区会这样想。我认为这是一个不同的问题。但是很抱歉。我应该删除另一个问题吗?
  • 随心所欲,我不是警察。

标签: linux bash shell awk sed


【解决方案1】:

调整my previous answer:

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

即:第一次,计算每第二个block出现多少次。第二次,继续为出现多次的数字附加一个递增的数字。因此,它不是比较整行,而是比较第二个字段,即冒号 : 中的所有内容。

进一步解释:

  • FNR==NR {actions; next} {more_actions} file1 file2 包括在读取第一个文件时做一些事情 actions 和其他 more_actions 在读取第二个文件时。当您想要比较文件时,这非常方便,就像我们在这里所做的那样。但是等等,这里我们只有一个文件,对吧?是的,但这也允许将文件中的行相互比较。在Idiomatic awk 了解更多信息。
  • 所以FNR==NR {count[$2]++; next} 在数组count 中存储每个第二个字段出现的次数。这样,Jose da Silva 是计数器 4 次,以此类推。注意我们使用 $2 作为数组的索引:这是基于分隔符 : 的第二个字段,我们使用 -F: 设置。也就是说,第一个字段是第一个 : 之前的所有内容,第二个字段是第一个 : 到第二个的所有内容,依此类推。
  • count[$2]>1 {$0=$0 OFS "#"++times[$2]} 这已经是第二次读取文件了。在这里,它不断检查当前时间的第二个字段上的计数器是否表示它发生了一次或多次。如果不止一次,它会在原始字符串$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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多