如何拆分文件并保留每个部分的第一行?

新手上路,请多包涵

给定: 一个带有“特殊”第一行(例如,字段名称)的大文本数据文件(例如 CSV 格式)。

需要: coreutils split -l 命令的等效项,但附加要求原始文件的标题行出现在每个结果片段的开头。

我猜一些 splithead 的混合物会起作用吗?

原文由 Arkady 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 456
2 个回答

这是 robhruska 的 脚本清理了一下:

 tail -n +2 file.txt | split -l 4 - split_
for file in split_*
do
    head -n 1 file.txt > tmp_file
    cat "$file" >> tmp_file
    mv -f tmp_file "$file"
done

我删除了 wccutlsecho 在那些不必要的地方。我更改了一些文件名以使它们更有意义。我把它分成多行只是为了更容易阅读。

如果您想变得花哨,可以使用 mktemptempfile 创建一个临时文件名,而不是使用硬编码的文件名。

编辑

使用 GNU split 可以这样做:

 split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }; export -f split_filter; tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_

为便于阅读而拆分:

 split_filter () { { head -n 1 file.txt; cat; } > "$FILE"; }
export -f split_filter
tail -n +2 file.txt | split --lines=4 --filter=split_filter - split_

当指定 --filter 时, split 为每个输出文件运行命令(在这种情况下是一个函数,必须导出)并设置变量 FILE ,命令的环境,文件名。

过滤器脚本或函数可以对输出内容甚至文件名进行任何它想要的操作。后者的一个示例可能是输出到变量目录中的固定文件名:例如 > "$FILE/data.dat"

原文由 Dennis Williamson 发布,翻译遵循 CC BY-SA 4.0 许可协议

这个单行将大 csv 拆分为 999 条记录,在每条记录的顶部保留标题行(因此 999 条记录 + 1 条标题 = 1000 行)

 cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'

基于 Ole Tange 的回答。

有关安装并行的一些提示,请参阅评论

原文由 Tim Richardson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题