我想使用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
路易斯
答案 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中所建议的那样,正则表达式无法替换数字比较,因为失败案例不会立即可见。