微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据条件和行数将文件拆分为几个文件,大约

如何解决根据条件和行数将文件拆分为几个文件,大约

我有一个包含以下示例的大文件

A222,00000,555
A222,00100,00200,00300,555

这是一个示例文件,其中包含订单标题(00000)和相关订单详细信息(00100、00200 等)。我想将文件拆分为大约 40000 行,每个文件都包含订单标题和订单详细信息。

我使用 GNU parallel 实现了 40000 行的拆分,但是我无法实现拆分以满足确保订单标题及其相关订单详细信息都在一行中的条件确保每个文件都有大约 40000 行

对于上面的示例文件,如果我必须将每个文件分成大约 5 行,我会使用下面的

parallel --pipe -N5 'cat > sample_{#}.txt' <sample.txt

但那会给我

sample1.txt
A222,555

sample2.txt
A222,555

一个文件中有第二个订单标题,第二个文件中有其相关的订单详细信息。

想要的应该是

sample1.txt
A222,555

解决方法

你可以试试这个代码:

( export hdr=$(head -1 sample.txt); parallel  --pipe -N4 '{ echo "$hdr"; cat; } > sample_{#}.txt' < <(tail -n +2 sample.txt) )

我们基本上将标题行分开并在剩余行上运行拆分,同时在每个拆分文件中包含标题。

,

单条记录:

cat file | parallel --pipe --recstart 'A222,00000,555' -n1 'echo Single record;cat'

多条记录(最多 --block-size

cat file | parallel --pipe --recstart 'A222,555' --block-size 100 'echo Multiple records;cat'

如果“A222”不保持不变:

cat file | parallel -k --pipe --regexp --recstart '[A-Z]\d+,00000' -N1 'echo Single record;cat'
,

当每个Order Header有很多记录时,你可以考虑简单

csplit -z sample.txt '/00000,/' '{*}'

这将为每个订单标题创建一个文件。它不考虑 ~40K 的要求,并且可能会产生非常多的文件,并且只有当您拥有有限数量(可能是 40 个?)不同的订单标题时,它才是一个可行的解决方案。

当您确实希望在一个文件中组合不同的标题时,请考虑

awk -v max=40000 '
   function flush() {
      if (last+nr>max || sample==0) {
         outfile="sample_" sample++ ".txt";
         last=0;
      }
      for (i=0;i<nr;i++) print a[i] >> outfile;
      last+=nr;
      nr=0;
   }
   BEGIN { sample=0 }
   /00000,/ { flush(); }
   {a[nr++]=$0}
   END { flush() }
   ' sample.txt

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。