如何解决根据条件和行数将文件拆分为几个文件,大约
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 举报,一经查实,本站将立刻删除。