使列标题唯一sed或awk

时间:2013-08-29 09:18:15

标签: 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
你能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ...