将字母转换为数字并在冒号前删除数字

时间:2014-05-09 08:51:01

标签: unix awk converter

我的数据在某些列中是字母的,并且冒号表示属性编号。如何将字母(单个大写字母)转换为数字,A到1,B到2 ... Z到26,还可以删除每列中冒号前的冒号和数字。例如,

A,1:2.33,2:3.18
M,1:8.72,2:7.25
Y,1:9.55,2:3.43
C,1:5.78,2:4.32

我想将其转换为

1,2.33,3.18
13,8.72,7.25
25,9.55,3.43
3,5.78,4.32

第一列没有冒号,第一列后面没有字母。

2 个答案:

答案 0 :(得分:4)

您可以使用awk将文本转换为数字,就像使用此命令一样:

split("ABCDEFGHIJKLMNOPQRSTUVWXYZ",a,"")

所以你可以得到这样的东西:

awk -F":|," 'BEGIN {split("ABCDEFGHIJKLMNOPQRSTUVWXYZ",a,"");for (i=1;i<=27;i++) x[a[i]]=i} {print x[$1],$3,$5}' OFS=, file
1,2.33,3.18
13,8.72,7.25
25,9.55,3.43
3,5.78,4.32

它使用a[1]=A a[2]=B等制作一个数组,然后将其转换为x[A]=1 x[B]=2 etc
:,拆分数据,然后将第一列从文本转换为值并打印其余部分。

使用google有助于解决此问题:How to print ASCII value of a character using basic awk only


要处理多个列:

awk -F":|," 'BEGIN {split("ABCDEFGHIJKLMNOPQRSTUVWXYZ",a,"");for (i=1;i<=27;i++) x[a[i]]=i} {printf "%s,",x[$1];for (i=3;i<NF;i+=2) printf "%s,",$i;print $NF}' OFS=, file

答案 1 :(得分:3)

Jotne的ABCD...Z解决方案有效,但我会发布另一个更通用(希望)的解决方案:

awk -F '[,:]' -v OFS="," 'BEGIN{for(n=65;n<100;n++)ord[sprintf("%c",n)]=++x}
{print ord[$1],$3,$5}' file

技巧在BEGIN块中。在这里我限制它,因此只有[A-Z]可以接受,这可能足以解决您的问题。但是如果你有其他字符(比如ascii中的所有字符),或者你想要返回其他索引逻辑,例如A->5, B->6...a-97,b-98...A-65, B-66...,你可以只改变n和{{1在上面的单行中。

相关问题