gpt4 book ai didi

Bash-awk-大文件每一行的并行选择过程

转载 作者:行者123 更新时间:2023-12-03 07:57:58 25 4
gpt4 key购买 nike

我正在尝试将一个非常大的文件的不同行发送到不同的进程。因此,为了展示我的问题,我正在构建一个玩具示例,其中我有一个包含 10 个类别的文件,并且我想计算每个类别的第二列的标准差 (sd)。请记住,我的真实文件是数百万行非常长的行,而 sd 计算实际上是一个更复杂的计算。

第 1 步构建测试文件:

seq 1 1000 | awk '{print int(10*rand()),int(100*rand())}' > testfile

第 2 步根据第 1 列进行拆分(我想计算第一个字段中不同值的第二列的方差)

cat testfile | awk '{print $2 >> "file"$1}'

第三步

现在我可以并行计算每个方差

for i in $(seq 0 9); do
cat file$i | awk '{s+=$1;ss+=$1*$1}END{a=s/NR;print sqrt((ss-a*a)/NR)}' > sd$i &
done

所以我想做的是跳过 file$i 部分并在读取初始文件时将我的数字直接发送到 10 个进程。

在某种程度上,它有点像使用并行,但不是发送行 block 到进程,而是使用字段将一些特定行发送到特定进程。

为了了解我必须处理的最后数据,我有 2377 个类别的 1300 万行数据。每行有 30K 个字段,我使用特定的 bash 命令进行统计

还请帮我提出我的问题!

最佳答案

GNU Parallel 为此提供了 --bin

seq 1 100000 | awk '{print int(10*rand()),int(100*rand()),int(15*rand())}' > testfile

sd() {
# sd 2 = sd of column 2
awk '{s+=$'$1';ss+=$'$1'*$'$1'}END{a=s/NR;print sqrt((ss-a*a)/NR)}'
}
export -f sd

# bin on col 1, sd on col 2
cat testfile | parallel -j10 --colsep ' ' --bin 1 --pipe --tagstring {%} sd 2
# bin on col 2, sd on col 3
cat testfile | parallel -j100 --colsep ' ' --bin 2 --pipe --tagstring {%} sd 3
# bin on col 3, sd on col 1
cat testfile | parallel -j15 --colsep ' ' --bin 3 --pipe --tagstring {%} sd 1

关于Bash-awk-大文件每一行的并行选择过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75546641/

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