如何用awk和gsub替换文件中的数字(分别用NA,0101,0102和0202替换-1,0,1和2)?

时间:2012-07-24 10:23:47

标签: linux awk gsub

我有一个这样的文件:

hgfjk
AX-75183725 2 2 -1 2 1 2 -1 0

我希望将-1012替换为NA01010102和分别为0202。所以我会得到:

hgfjk
AX-75183725 0202 0202 NA 0202 0101 0202 NA 0101

我使用这个命令:

awk 'NR == 1 { print; next } NR>1{a=$1;$1="@";gsub(/ -1\>/,"NA");gsub(/<0\>/,"0101");gsub(/<1\>/,"0102");gsub(/\<2\>/,"0202");$1=a;print}' file > out

给了我这个输出:

hgfjk
AX-75183725 0202 2NA 0202 0102 2NA 0101

我不知道有什么问题!有人可以帮助谢谢

1 个答案:

答案 0 :(得分:2)

我会创建一个包含要替换的值的数组。并计算每个领域的每个位置,但是第一个。

awk '
    BEGIN {
        subs="NA 0101 0102 0202";
        split( subs, subs_arr );
    }
    NR == 1 { 
        print; 
        next 
    } 
    NR>1{
        for ( i = 2; i <= NF; i++ ) {
            $i = subs_arr[ $i + 2 ];
        }
        print
    }
' file

运行上一个命令并获得以下输出:

hgfjk
AX-75183725 0202 0202 NA 0202 0102 0202 NA 0101

编辑:我提供了一个解决方案,但我猜你的工作因为gsub(/<0\>/,"0101")gsub(/<1\>/,"0102")而无效。您也应该转义<,例如:gsub(/\<0\>/,"0101")gsub(/\<1\>/,"0102")