我有一些重复信息的文件。 这些线被编号,后面跟着冒号,然后是信息。 我想提出一个序列号只在重复信息的末尾。
例。
输入:
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
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