awk,If 测试用 2 列替换 1 列

发布于 2024-10-07 22:27:20 字数 502 浏览 1 评论 0原文

美好的一天,

我有以下数据矩阵,

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 出来记忆力,而且需要很长时间。

Good day

I have the following data matrix

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

I would like to double the columns according to the following conditions

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

So the expected output for the example, would be

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

I usually use R and Octave matrices but the current matrix in quiet large after a while R get out of memory and it takes long.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏雨凉 2024-10-14 22:27:20
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 
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 
梦情居士 2024-10-14 22:27:20

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

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

If the data matrix only contains 0, 1 or 2, you could use a simple truncation trick:

awk '{
    for (i=1;i<=NF;i++) 
        printf "%d %d ", 1+ $i/2, 1+ ($i+1)/2 
}' file && echo
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文