2013-08-29 55 views
0

我有一個大的空格分隔文本文件與非唯一列標題。我想通過使用sed或awk做類似這樣的操作使列標題獨一無二。一組新名稱以列名開頭使列標題唯一sed或awk

input  
index type colx...names paul peter sarah... names paul peter sarah.... names paul peter sarah 

output 
index type colx...0names 0paul 0peter 0sarah... 1names 1paul 1peter 1sarah.... 2names 2paul 2peter 2sarah 

你能幫我解決嗎?

+0

我道歉,忘了說,該文件已經有一些其他的唯一列非唯一的人開始 –

回答

1

我猜你的實際文件看起來是更像是這樣的:

names paul peter sarah names paul peter sarah names paul peter sarah 
data1 ... 
data2 ... 
data3 ... 

如果是這樣,這將這樣的伎倆情況:

$ awk 'NR==1{for(i=1;i<=NF;i++)$i=a[$i]++ $i}1' file 
0names 0paul 0peter 0sarah 1names 1paul 1peter 1sarah 2names 2paul 2peter 2sarah 
data1 ... 
data2 ... 
data3 ... 

編輯:

要跳過前3列,只需從第4列開始:

$ awk 'NR==1{for(i=4;i<=NF;i++)$i=a[$i]++ $i}1' file 
index type colx 0names 0paul 0peter 0sarah 1names 1paul 1peter 1sarah 2names ... 
data1 ... 
data2 ... 
data3 ... 
+0

有沒有一種方法來指定在列停止? –

+0

當然,你可以很容易想到,但是,只要改變'i <= NF'或者'i <= 10'或者你需要什麼值。 –

+0

完美:)我只學習awk –

2

這AWK一行代碼可以幫助:

awk '{for(i=1;i<=NF;i++)printf "%s"(i==NF?"\n":" "),a[$i]++$i}' 

測試:

kent$ awk '{for(i=1;i<=NF;i++)printf "%s"(i==NF?"\n":" "),a[$i]++$i}'<<<"names paul peter sarah names paul peter sarah names paul peter sarah" 
0names 0paul 0peter 0sarah 1names 1paul 1peter 1sarah 2names 2paul 2peter 2sarah 

編輯了新的要求:

awk '{for(i=1;i<=NF;i++)a[$i]++; for(i=1;i<=NF;i++)$i=(a[$i]>1)?a[$i]++-2$i:$i}7' 

測試:(我縮短你的榜樣,但它應該是同樣的問題)

kent$ awk '{for(i=1;i<=NF;i++)a[$i]++; for(i=1;i<=NF;i++)$i=(a[$i]>1)?a[$i]++-2$i:$i}7'<<<"a b c x y z x y z" 
a b c 0x 0y 0z 1x 1y 1z 
+0

之前,能否請您看在我的問題 –

+0

編輯@SantoshPillai看到編輯 – Kent

+0

的解決方案似乎修改數據以及。我正在尋找只修改第一行 –