【问题标题】:How to replace numbers in a file by awk and gsub (replace -1, 0, 1 and 2 by NA, 0101, 0102 and 0202 respectively)?如何用 awk 和 gsub 替换文件中的数字(分别用 NA、0101、0102 和 0202 替换 -1、0、1 和 2)?
【发布时间】:2012-07-24 10:23:47
【问题描述】:

我有一个这样的文件:

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

不知道怎么回事!!谁能帮忙谢谢

【问题讨论】:

    标签: linux awk gsub


    【解决方案1】:

    我会用要替换的值创建一个数组。并将计算除第一个字段之外的每个字段的每个位置。

    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(/&lt;0\&gt;/,"0101")gsub(/&lt;1\&gt;/,"0102")。您也应该转义 &lt;,例如:gsub(/\&lt;0\&gt;/,"0101")gsub(/\&lt;1\&gt;/,"0102")

    【讨论】:

      猜你喜欢
      • 2021-06-09
      • 1970-01-01
      • 2018-10-19
      • 2020-11-03
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多