gpt4 book ai didi

awk - 将每隔一行变成一个新列

转载 作者:行者123 更新时间:2023-12-02 03:44:11 24 4
gpt4 key购买 nike

所以,我的输出如下所示:

samples pops    condition 1     condition 2 condition 3

A10051 15 1 3 4
A10051 15 2 4 4
A10052 15 2 1 4
A10052 15 2 1 4

但是,对于下一次分析,我需要输入如下所示

samples pops    condition 1     condition 1     condition 2     condition 2 condition 3 condition 3

A10051 15 1 2 3 4 4 4
A10052 15 2 2 1 1 4 4

因此,它不仅仅是使每隔一行都是一个新列,给定列中的每隔一行都将位于分配给相同条件的新列中,这样每个样本都有两列相同的条件,而不是同一样本的两行。对于这个例子,我放置了 2 个样本和 3 个条件,但是 IRL 我有超过 100 个样本和超过 1000 个条件......有什么想法吗?我相信它可以用 awk 完成,但我就是不明白。

最佳答案

3个条件列

从表面上看“数据是完美的”这一断言,而忽略多年的经验,这表明数据很少(如果有的话)是完美的,那么:

awk 'NR == 1 { printf "%s  %s  %s  %s  %s  %s  %s  %s\n",
$1, $2, $3, $3, $4, $4, $5, $5; next }
NR == 2 { next }
NR % 2 == 1 { c[1] = $3; c[2] = $4; c[3] = $5 }
NR % 2 == 0 { printf "%s %d %d %d %d %d %d %d\n",
$1, $2, c[1], $3, c[2], $4, c[3], $5 }' "$@"

给定输入文件:

samples pops    condition_1     condition_2 condition_3

A10051 15 1 3 4
A10051 15 2 4 4
A10052 15 2 1 4
A10052 15 2 1 4

脚本产生输出:

samples  pops  condition_1  condition_1  condition_2  condition_2  condition_3  condition_3
A10051 15 1 2 3 4 4 4
A10052 15 2 2 1 1 4 4

这段代码机械性多于有趣性。如果每行有 10 列,您的处理方式会有所不同。您可能会使用循环来保存和打印数据。如果您希望标题和数据之间有一个空行,您可以轻松添加一个 (NR == 2 { print; next } 或使用 \n\n 代替第一个 printf 函数中的 \n )。如果您愿意,您可以安排输出字段由制表符分隔(在此代码中它们由双空格分隔)。

代码不依赖于分隔数据字段的制表符;它仅取决于字段内没有空白。

许多条件列

当条件列较多时,需要使用数组和循环来捕获并打印数据,如下所示:

awk 'NR == 1 { printf "%s  %s", $1, $2
for (i = 3; i <= NF; i++) printf " %s %s", $i, $i
print ""
next
}
NR == 2 { next }
NR % 2 == 1 { for (i = 3; i <= NF; i++) c[i] = $i }
NR % 2 == 0 { printf "%s %d", $1, $2;
for (i = 3; i <= NF; i++) printf " %d %d", c[i], $i
print ""
}' "$@"

当在与以前相同的数据上运行时,它会产生与以前相同的输出,但循环将允许它在每个输入行读取 1000 个条件,并在每个输出行生成 2000 个条件。唯一可能的问题是您的 Awk 版本是否首先处理这么长的输入行。如果需要,请升级到 GNU Awk。

关于awk - 将每隔一行变成一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47338286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com