awk,如果测试用2列替换1列

时间:2010-12-15 14:55:38

标签: awk

美好的一天

我有以下数据矩阵

1 1 0 0 1 
2 0 0 1 1 
1 1 0 0 1 
2 1 2 2 0

我想根据以下条件加倍列

Condition 1   if $i == 0, replace with 1 1 (i.e. in 2 columns)
Condition 2   if  $i == 1, replace with 1 2
Condition 3    if  $i == 2, replace with 2 2

因此该示例的预期输出将是

1 2  1 2  1 1 1 1 1 2 
2 2  1 1  1 1 1 2 1 2 
1 2  1 2  1 1 1 1 1 2 
2 2  1 2  2 2 2 2 1 1

我通常使用R和Octave矩阵但是当前矩阵在安静的大片中经过一段时间R内存并且需要很长时间。

2 个答案:

答案 0 :(得分:2)

awk 'BEGIN {
  map[0] = "1 1"; map[1] = "1 2"; map[2] = "2 2"
  }
{
  for (i = 1; i <= NF; i++)
    printf "%s", (map[$i] (i < NF ? FS : RS))
  }' infile 

答案 1 :(得分:1)

如果数据矩阵只包含0,1或2,则可以使用简单的截断技巧:

awk '{
    for (i=1;i<=NF;i++) 
        printf "%d %d ", 1+ $i/2, 1+ ($i+1)/2 
}' file && echo