gpt4 book ai didi

linux - 在awk中将不同的行累积到不同的文件中

转载 作者:太空狗 更新时间:2023-10-29 11:49:03 25 4
gpt4 key购买 nike

我有一个巨大的 .txt 文件 (15 GB),包含近 3000 万行。

我想根据 4th 列将它的行放到不同的文件中。 4th 列的 unique 数在 200 万。

file1.txt
1 10 ABC KK-LK
1 33 23 KK-LK
2 34 32 CK-LK,LK
11 332 2 JK@
11 23 2 JK2

现在,我可以将这些行分隔到同一文件夹中的不同文件,如下所示:

awk '{ print $0 >> $4"_sep.txt" }' file1.txt

它会生成 4 个不同的文件:

KK-LK_sep.txt
1 10 ABC KK-LK
1 33 23 KK-LK

CK-LK,LK_sep.txt
2 34 32 CK-LK,LK

JK@_sep.txt
11 332 2 JK@

最后,

JK2_sep.txt
11 23 2 JK2

我想要的是,不要将200万个文件放在一个文件夹中,而是将它们分成20个不同的文件夹。我可以将文件夹设为 folder1,2,3....:

mkdir folder{1..20}

有了下面的答案,我想像下面的代码这样的东西会起作用:

#!/bin/env bash

shopt -s nullglob
numfiles=(*)
numfiles=${#numfiles[@]}
numdirs=(*/)
numdirs=${#numdirs[@]}
(( numfiles -= numdirs ))
echo $numfiles
var1=$numfiles

awk -v V1=var1 '{
if(V1 <= 100000)
{
awk '{ print $0 >> $4"_sep.txt" }' file1.txt

}

else if(V1 => 100000)
{
cd ../folder(cnt+1)
awk '{ print $0 >> $4"_sep.txt" }' file1.txt

}


}'

但是,一旦其中包含 100.000 文件,我如何才能使它成为一个循环并停止添加到 folder1,然后开始将文件添加到 folder2 等等?

最佳答案

也许这就是您想要的(未经测试,因为您的问题不包含我们可以测试的示例):

awk '
!($4 in key2out) {
if ( (++numKeys % 100000) == 1 ) {
dir = "dir" ++numDirs
system("mkdir -p " dir)
}
key2out[$4] = dir "/" $4 "_sep.txt"
}
{ print > key2out[$4] }
' file1.txt

这依赖于 GNU awk 在内部管理打开文件的数量。对于其他 awk,您需要将最后一行更改为 { print >> key2out[$4]; close(key2out[$4]) } 或以其他方式处理您必须同时打开的文件数,以避免出现“打开的文件太多”错误,例如如果您的 $4 值通常组合在一起,那么比在每次写入时打开和关闭输出文件更有效,您可以在 $4 值更改时执行此操作:

awk '
$4 != prevKey { close(key2out[prevKey]) }
!($4 in key2out) {
if ( (++numKeys % 100000) == 1 ) {
dir = "dir" ++numDirs
system("mkdir -p " dir)
}
key2out[$4] = dir "/" $4 "_sep.txt"
}
{ print >> key2out[$4]; prevKey=$4 }
' file1.txt

关于linux - 在awk中将不同的行累积到不同的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49326188/

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