如何在awk中将整数更改为其等效字符串?

时间:2015-09-19 02:51:43

标签: bash unix awk

假设我有一个输入为1,2,3等的文本文件。如何将其更改为一,二,三,反之亦然?

我只是想知道为if语句设置字段值的方法。

#! usr/bin/awk -f`
{
for(i=0; i<= NF; i++)
   if(i == "1")
     printf "one"
}

2 个答案:

答案 0 :(得分:2)

不要使用一堆if-else,因为它非常低效,难以维护,并且在给定所有重复代码的情况下容易出现编码错误。只需使用一个数组(在awk中是一个非常有效的哈希表)将每个数字映射到它的名称:

echo '1,2,3,4,5,6,7,8,9' |
awk -F, 'BEGIN{split("one,two,three,four,five,six,seven,eight,nine",m)}
         {for (i=1;i<=NF;i++) printf "%s=%s%s", $i, m[$i], (i<NF?OFS:ORS)}'
1=one 2=two 3=three 4=four 5=five 6=six 7=seven 8=eight 9=nine

答案 1 :(得分:-1)

以下代码说明: 代码的BEGIN部分将字段分隔符设置为“,”。这样,for语句将使用$ NF变量循环遍历字段,该变量存储当前记录所具有的字段数。

其余代码与任何结构编程语言非常相似。

BEGIN { FS="," }

function get_text_number(num) {
    if(num == "0") {
        return "zero"
    }
    else if(num == "1") {
        return "one"
    }
    else if(num == "2") {
        return "two"
    }
    else if(num == "3") {
        return "three"
    }
    else if(num == "4") {
        return "four"
    }
    else if(num == "5") {
        return "five"
    }
    else if(num == "6") {
        return "six"
    }
    else if(num == "7") {
        return "seven"
    }
    else if(num == "8") {
        return "eight"
    }
    else if(num == "9") {
        return "nine"
    }
}

{
    for(i = 1; i <= NF -1 ; i++) { 
        printf("%s,",get_text_number($i)); 
    }
    printf("%s\n",get_text_number($NF)); 
}

执行:awk -f transform.awk test.txt