我遇到了一个相当简单的任务(这更令人沮丧;-)): 我有一个这样的专栏:
>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环境
非常感谢!
答案 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>