) { -6ren">
gpt4 book ai didi

linux - 将 LINUX 中的一个大文件拆分为多个小文件(每个小于 100MB),在特定行处使用模式匹配进行拆分

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:08 24 4
gpt4 key购买 nike

我有以下源文件 (~10GB),我需要分成几个小文件(每个 <100MB),每个文件应该有相同的头记录。棘手的部分是我不能使用一些拆分命令在任何随机行拆分文件。属于代理人的记录不应拆分为多个文件。为简单起见,我在这里只展示了 2 个代理(真实文件中有数千个)。

Inout.csv
Src,AgentNum,PhoneNum
DWH,Agent_1234,phone1
NULL,NULL,phone2
NULL,NULL,phone3
DWH,Agent_5678,phone1
NULL,NULL,phone2
NULL,NULL,phone3
DWH,Agent_9999,phone1
NULL,NULL,phone2
NULL,NULL,phone3

Output1.csv
Src,AgentNum,PhoneNum
DWH,Agent_1234,phone1
NULL,NULL,phone2
NULL,NULL,phone3
Output2.csv
Src,AgentNum,PhoneNum
DWH,Agent_5678,phone1
NULL,NULL,phone2
NULL,NULL,phone3
DWH,Agent_9999,phone1
NULL,NULL,phone2
NULL,NULL,phone3

#!/bin/bash
#Calculate filesize in bytes
FileSizeBytes=`du -b $FileName | cut -f1`

#Check for the file size
if [[ $FileSizeBytes -gt 100000000 ]]
then
echo "Filesize is greater than 100MB"
NoOfLines=`wc -l < $FileName`
AvgLineSize=$((FileSizeBytes / NoOfLines))
LineCountInEachFile=$((100000000 / AvgLineSize))

#Section for splitting the files

else
echo "Filesize is already less than 100MB. No splitting needed"
exit 0
fi

我是 UNIX 的新手,但我自己尝试了这个 bash 脚本,但在拆分文件时遇到了困难。我不希望有人给我一个完整的脚本,我正在寻找任何可能使用其他简单替代方法(如 sed 等)的简单方法/建议。非常感谢!

最佳答案

这里是关于如何在 Perl 中执行此操作的粗略概念。如果与您的实际数据不完全匹配,请修改正则表达式。我只在你的虚拟数据上测试过它。

#!/usr/bin/perl -w    
my $l=<>; chomp($l); my $header=$l;
my $agent=""; my $fh;

while ($l=<>) {
chomp($l);
if ($l=~m/^\s*[^,]+,(Agent_\d+),[^,]+/) {
$agent="$1";
open($fh,">","${agent}.txt") or die "$!";
print $fh $header."\n";
}
print $fh $l."\n";
}

按如下方式使用:

./perlscript.pl < inputfile.txt

如果您没有 perl(在/usr/bin/perl 或其他类似位置检查 perl),我将尝试编写一个 awk 脚本。如果您在上述脚本中发现运行问题,请告诉我。


为了响应您更新后的请求,即您只想拆分文件,每个输出文件小于 100MB,没有代理记录拆分成两个文件,并且该标题打印在每个输出文件中,这里是关于如何实现它的粗略想法。它没有精确切割(因为您需要在编写之前进行计算)。如果您将 $maxfilesize 设置为 95*1024*1024 99*1024*1024,这应该让您拥有小于 100MB 的文件(例如,如果代理记录的最大大小小于 5MB,则设置 $maxfilesize95*1024*1024)

#!/usr/bin/perl -w    
# Max file size, approximately in bytes
#
# For 99MB make it as 99*1024*1024
#
my $maxfilesize=95*1024*1024;
#my $maxfilesize=400;

my $l=<>; chomp($l); my $header=$l;

my $fh;
my $filecounter=0;
my $filename="";
my $filesize=1000000000000; # big dummy size for first iteration

while ($l=<>) {
chomp($l);
if ($l=~m/^\s*[^,]+,Agent_\d+,[^,]+/) {
if ($filesize>$maxfilesize) {
print "FileSize: $filesize\n";
$filecounter++; $filename=sprintf("outfile_%05d",$filecounter);
print "Opening New File: $filename\n";
open($fh,">","${filename}.txt") or die "$!";
print $fh $header."\n";
$filesize=length($header);
}
}
print $fh $l."\n";
$filesize+=length($l);
print "FileSize: $filesize\n";
}

如果你想要比这更精确的切割,我会在打印前更新它缓冲数据。

关于linux - 将 LINUX 中的一个大文件拆分为多个小文件(每个小于 100MB),在特定行处使用模式匹配进行拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40009441/

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