将数字替换为多列

时间:2018-01-12 14:41:46

标签: awk

我想使用awk在我的矩阵中将那些大于一的数字(将0保留为0)替换掉。我尝试过使用:

awk '$2>1 {$2=1} 1'

但是,我找不到选择多个列的方法(我有30个)。 如果我可以避免替换标题的字符,那也很棒。 例如,如果我的表是:

Species  Sample_1 Sample_2 Sample_3
Species_1   15      4         0
Species_2   10      3         2

我想获得:

Species  Sample_1 Sample_2 Sample_3
Species_1   1      1         0
Species_2   1      1         1

路易斯

3 个答案:

答案 0 :(得分:3)

awk '{
  if (NR>1) {
   for (C=2; C<=NF; C++) {
     if ($C > 1) {$C=1}
   }
  }
  print
}'

答案 1 :(得分:3)

$ awk '
NR>1 {
    for (i=2; i<=NF; i++) {
        $i = ($i > 1 ? 1 : $i)
    }
}
1' file | column -t
Species    Sample_1  Sample_2  Sample_3
Species_1  1         1         0
Species_2  1         1         1

答案 2 :(得分:0)

sed这样做的方式是

sed -E '2,${s/ 1?[2-9]+/ 1/g;s/ 1[0-9]+/ 1/g}' case_file_48228498 | column -t
Species    Sample_1  Sample_2  Sample_3
Species_1  1         1         0
Species_2  1         1         1

修改1

我已经修改了上面的脚本,以包含评论中建议/找到的角落案例。测试输入包含用于分隔输入的空格和制表符:

# cat case_file_48228498
Species    Sample_1   Sample_2      Sample_3
Species_1   1501      400000         010101
Species_2   10002     00400         00000 
Species_3   20000     100001        000000100044

以下是我修改过的脚本

# sed -E '2,${s/\s0+([1-9]+)/ \1/;s/\s1?[2-9]+/ 1/g;s/\s([0-1])[0-9]+/ \1/g}'  case_file_48228498 | column -t
Species    Sample_1  Sample_2  Sample_3
Species_1  1         1         1
Species_2  1         1         0
Species_3  1         1         1

注意:实际上,上面显示的是过度杀伤力。但还有更多。正如@Ed-Morton comment中所建议的那样,正则表达式无法替换数字比较,因为失败案例不会立即可见。