我的数据在某些列中是字母的,并且冒号表示属性编号。如何将字母(单个大写字母)转换为数字,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
第一列没有冒号,第一列后面没有字母。
答案 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在上面的单行中。