2012-07-24 104 views
0

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

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

,我想通过NA010101020202分别替换-1012。所以我会得到:

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 

我不知道什么是错的!有人可以帮助谢谢

回答

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")