bash:按当前出现次数/运行次数更改列字段

时间:2017-07-25 09:55:06

标签: string bash duplicates

我遇到了一个相当简单的任务(这更令人沮丧;-)): 我有一个这样的专栏:

>foo111_bar37
>foo111_bar38
>foo111_bar40
>foo111_bar40
>foo111_bar41
>foo111_bar42
>foo111_bar49
>foo111_bar49
>foo111_bar49
...

我想要修改此列或获取一个新列,其中包含相同字符串的当前计数

>foo111_bar37x1
>foo111_bar38x1
>foo111_bar40x1
>foo111_bar40x2
>foo111_bar41x1
>foo111_bar42x1
>foo111_bar49x1
>foo111_bar49x2
>foo111_bar49x3
...

目标是该行变得唯一并且仍然包含原始信息。 我发现了如何使用awk添加列并一般更改字符串(例如,总是附加“x1”),但不知道如何使用特定于数字的更改来执行此操作。 大多数人似乎想要摆脱他们的副本或计算重复的总数,这对我没有帮助。

BTW:我在Windows上使用MobaXterm bash环境

非常感谢!

2 个答案:

答案 0 :(得分:2)

使用awk,你有它可用吗?

$ awk '{a[$1]++;print $1 "x" a[$1]}' file
>foo111_bar37x1
>foo111_bar38x1
>foo111_bar40x1
>foo111_bar40x2
>foo111_bar41x1
>foo111_bar42x1
>foo111_bar49x1
>foo111_bar49x2
>foo111_bar49x3

说明:

$ awk ' {
   a[$1]++             # store to hash a using first field as key. ++ increases
                       # its value by 1 on each iteration for each $1
   print $1 "x" a[$1]  # output $1, "x" and current value of a[$1]
}' file

答案 1 :(得分:1)

一个更短的解决方案(保持概念相同),而不是詹姆斯布朗先生的好回答。

awk '{print $0"x"++array[$0]}'  Input_file

说明:因此print关键字会打印出awk中的行,所以这里我打印当前行$ 0然后打印字符串x然后打印名为array的数组,其索引只有$ 0,+ + array [$ 0]意味着首先它将增加该数组索引的值然后它将打印它。

让我们说(foo111_bar40)来了一次所以它将在数组中有索引并且它的值将是1所以下次数组看到这个索引已经存在于数组中,所以它只是将它递增1然后打印它。 / p>