awk 将除 0,1,2 之外的任何值更改为缺失 (NA)

awk 将除 0,1,2 之外的任何值更改为缺失 (NA)

我有一个巨大的文件,其中有许多列和行的数值。列的值都是数字,98% 是 [0 或 1 和 2];然而对于某些来说,这些超出了 0,1 和 2,例如1.7333360.4567777。我想将所有非 0,1 和 2 的值替换为 NA。我可以为 awk 做这个吗?我的输入文件是这样的,但此后有很多列:

id  A_101   A_102   A_103
20971530    1   0   0   0
31457209    0   2   0   0
31405731    0.45663 0   0   2
40194308    0   0   0   1.7655

答案1

awk '
    BEGIN { ok[1]; ok[2]; ok["0"]; ok["NA"] }
    NR > 1 {
        for (i=2; i <= NF; i++)
            if (!($i in ok))
                sub($i "[[:blank:]]*", "NA  ")
    }
    {print}
'
id  A_101   A_102   A_103
20971530    1   0   0   0
31457209    0   2   0   0
31405731    NA  0   0   2
40194308    0   0   0   NA

答案2

$ awk '
    NR>1 {
        for ( i=2; i<=NF; i++ ) {
            if ( $i !~ /^[012]$/ ) {
                $i = "NA"
            }
        }
    }
    { print }
' file | column -t
id        A_101  A_102  A_103
20971530  1      0      0      0
31457209  0      2      0      0
31405731  NA     0      0      2
40194308  0      0      0      NA

相关内容