【问题标题】:Convert alphabets to numbers and remove numbers before a colon将字母转换为数字并删除冒号前的数字
【发布时间】:2014-05-09 18:17:59
【问题描述】:

我的数据在某些列中按字母顺序排列,并且冒号表示属性编号。如何将字母(单个大写字母)转换为数字,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

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

【问题讨论】:

    标签: unix awk converter


    【解决方案1】:

    您可以使用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
    

    【讨论】:

    • 我知道转换位,但是由于我问的是第二部分,所以我问了第一部分,只是想知道awk中是否存在更琐碎的东西。没有想到拆分数组位,我有一个问题要问你。如何将此扩展到具有 100 列或更多列的数据。一般来说,有什么方法可以打印每个备用行吗?谢谢!!
    • @lovedynasty 如果你有很多带有:的列,并且你想删除,你可以考虑使用gsub()。例如扩展@kent的解决方案awk -F, 'BEGIN{..}{$1=ord[$1];gsub(/,[0-9]+:/,",")}1' file(或者我应该在这里使用7而不是1?):-)
    • @Imagination 71 也是如此。一个数字给出默认的true,并会执行默认的操作,打印。
    【解决方案2】:

    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-&gt;5, B-&gt;6...a-97,b-98...A-65, B-66...,您可以在上面的单行中更改 nx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      相关资源
      最近更新 更多