gpt4 book ai didi

bash - 根据 bash 中第一列中的组数和最大行号拆分文件

转载 作者:行者123 更新时间:2023-12-04 02:29:51 24 4
gpt4 key购买 nike

考虑以下(已排序)文件 test.txt,其中第一列中 a 出现 3 次,b 出现一次,c 出现了 2 次,d 出现了 4 次。

a 1
a 2
a 1
b 1
c 1
c 1
d 2
d 1
d 2
d 1

我想将此文件拆分为最多 4 行的较小文件。但是,我需要保留较小文件中的组,这意味着 $1 列中以相同值开头的所有行都需要位于同一文件中。在此示例中,组的大小绝不会大于所需的输出长度。

预期的输出是:

文件1:

a 1
a 2
a 1
b 1

文件2:

c 1
c 1

文件3:

d 2
d 1
d 2
d 1

从预期的输出中,您可以看到,如果两个或多个组的行数少于最大行数(此处为 4),则它们应该进入同一个文件。

因此:a + b 共有 4 个条目,它们可以进入同一个文件。但是,c + d 共有 6 个条目。因此 c 必须放在它自己的文件中。

我知道这个 Awk oneliner:

awk '{print>$1".test"}' test.txt

但这会导致每个组都有一个单独的文件。这在我面临的现实世界问题中没有多大意义,因为它会导致大量文件被传输到 HPC 并返回并使开销过于密集。

首选 bash 解决方案。但它也可以是 Python。

最佳答案

另一个 awk。度过了忙碌的一天,这仅使用您的示例数据进行了测试,因此任何事情都可能发生。它创建名为 filen.txt 的文件,其中 n>0:

$ awk -v n=4 '
BEGIN {
fc=1 # file numbering initialized
}
{
if($1==p||FNR==1) # when $1 remains same
b=b (++cc==1?"":ORS) $0 # keep buffering
else {
if(n-(cc+cp)>=0) { # if room in previous file
print b >> sprintf("file%d.txt",fc) # append to it
cp+=cc
} else { # if it just won t fit
close(sprintf("file%d.txt",fc))
print b > sprintf("file%d.txt",++fc) # creat new
cp=cc
}
b=$0
cc=1
}
p=$1
}
END { # same as the else above
if(n-(cc+cp)>=0)
print b >> sprintf("file%d.txt",fc)
else {
close(sprintf("file%d.txt",fc))
print b > sprintf("file%d.txt",++fc)
}
}' file

关于bash - 根据 bash 中第一列中的组数和最大行号拆分文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64909444/

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