我有一个文件,其中包含一些重复的信息。这些行是编号的,后跟冒号,后跟信息。我只想在重复信息的末尾放置一个序列号。
例。
输入:
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
[这个问题与这个问题不同,因为这里的线条完全不同(每行都有不同的数字)。我的输入/输出示例可能看起来非常相似,但在实际应用程序中并非如此。
调整我之前的答案:
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
包括在读取第一个文件时actions
执行一些操作,在读取第二个文件时执行其他more_actions
操作。当您想比较文件时,这非常方便,就像我们在这里所做的那样。但是等等,这里我们只有一个文件,对吧?是的,但这也允许将文件中的行相互比较。有关此内容的更多信息,请参阅惯用语awk。- 因此,数组中的
FNR==NR {count[$2]++; next}
存储count
每个第二个字段出现的次数。这样,何塞·达席尔瓦被反击了 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