Você pode tentar este awk
awk 'NR>1{for(i=2;i<=NF;i++)$i=$i<25?0:$i}1' infile
NR > 1 mantém a primeira linha
i = 2 manter a primeira coluna
Eu tenho uma matriz na qual eu quero substituir todos os valores com 0 se eles estiverem abaixo de 25. Eu quero manter a primeira linha e coluna.
p1 p10 p16 p19 p25 p3 p5 p6 p8 p9
call1 567 0 3 0 18 17 8 4 6 7
call20 4900 7 6 2 23 26 20 14 12 29
echo34 73784 1 4 1 6 4 1 4 8 5
kol45 145873 6 4 0 11 17 5 9 22 11
Quando estou removendo esses valores, também estou removendo nomes de linhas e colunas e não quero isso.
Você pode tentar este awk
awk 'NR>1{for(i=2;i<=NF;i++)$i=$i<25?0:$i}1' infile
NR > 1 mantém a primeira linha
i = 2 manter a primeira coluna
Usando o R:
dat <- as.matrix(read.table(text="p1 p10 p16 p19 p25 p3 p5 p6 p8 p9
call1 567 0 3 0 18 17 8 4 6 7
call20 4900 7 6 2 23 26 20 14 12 29
echo34 73784 1 4 1 6 4 1 4 8 5
kol45 145873 6 4 0 11 17 5 9 22 11"))
dat
# p1 p10 p16 p19 p25 p3 p5 p6 p8 p9
# call1 567 0 3 0 18 17 8 4 6 7
# call20 4900 7 6 2 23 26 20 14 12 29
# echo34 73784 1 4 1 6 4 1 4 8 5
# kol45 145873 6 4 0 11 17 5 9 22 11
dat[-1, -1][dat[-1, -1] < 25] <- 0
dat
# p1 p10 p16 p19 p25 p3 p5 p6 p8 p9
# call1 567 0 3 0 18 17 8 4 6 7
# call20 4900 0 0 0 0 26 0 0 0 29
# echo34 73784 0 0 0 0 0 0 0 0 0
# kol45 145873 0 0 0 0 0 0 0 0 0
Isso parece fazer o truque:
$ awk '{ for (field=1;field<=NF;field++) { if( NR > 1 && field>=2 && $field < 25 ) { $field=0 } } print }' input
p1 p10 p16 p19 p25 p3 p5 p6 p8 p9
call1 567 0 0 0 0 0 0 0 0 0
call20 4900 0 0 0 0 26 0 0 0 29
echo34 73784 0 0 0 0 0 0 0 0 0
kol45 145873 0 0 0 0 0 0 0 0 0
Para preservar o espaçamento, você pode fazer algo como:
perl -pe '
if ($. > 1) {
$skip = 2;
s{ +\d+}{
--$skip > 0 || $& >= 25 ? $& : " " x (length($&) - 1) . "0"
}ge
}' < file
Comprimido:
perl -pe'if($.>1){$s=2;s@ +\d+@--$s>0||$&>24?$&:" "x(length($&)-1)."0"@ge}' file
Tags r