0

我有一个带有非唯一列标题的大空格分隔文本文件。我想通过使用 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

你能帮我解决这个问题吗?

4

2 回答 2

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
于 2013-08-29T09:26:54.917 回答
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 ...
于 2013-08-29T09:28:48.540 回答