2017-07-25 52 views
3

我卡住了一個相當簡單的任務(這更加令人沮喪;-))更改列字段: 我有這樣一欄:慶典:由當前數字occurence的/運行數

>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:我使用的是bash的MobaXterm環境在Windows

非常感謝!

回答

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

完美,這麼簡單......你能給我一個關於「++」的提示嗎? – crazysantaclaus

+0

更新對解決方案的簡要說明。 –

1

多一點較短的解決方案(保持同一概念),比詹姆斯·布朗先生的偉大的答案。

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

說明:所以打印關鍵字將打印在awk中的線,所以在這裏我打印了當前行了$ 0,那麼打印串x,然後打印數組命名的數組,其指數只有$ 0 ++數組[$ 0]意味着首先增加數組索引的值,然後它將打印它。讓我們假設(foo111_bar40)來了一次,所以它將有數組中的索引,它的值將是1,所以下一次數組看到這個索引已經存在於數組中,因此它只是將它加1並打印出來。