如何用单行Linux命令按首列拆分大文件为分块gzip包并自动建目录
单行按首列拆分大文件为分块gzip实现方案
问题场景
是否可以通过单行命令将文件拆分为多个分类存储的gzip分块文件?
现有超大文件data.txt,示例内容:
A somedata 1 B somedata 1 A somedata 2 C somedata 1 B somedata 2
无分类拆分时可直接使用如下命令,生成单块100MB的gzip分块:
cat data.txt | gzip -5 -c | split -d -a 3 -b 100000000 - one_dir/one_dir.gz.
实际需求为按每行第一列的取值分类,自动创建A、B、C三类目录,每个目录下存放对应分类内容的100MB分块gzip文件,目录结构要求:
A/ A.gz.000 A.gz.001 ... B/ B.gz.000 B.gz.001 ... C/ C.gz.000 C.gz.001 ...
要求基于cat/awk/gzip/split组合实现,支持自动创建不存在的目录。
可用单行命令
awk '{d=$1; system("mkdir -p " d); print | "gzip -5 -c | split -d -a 3 -b 100000000 - " d "/" d ".gz."}' data.txt
命令逻辑说明
- 由awk逐行读取源文件,提取每行第一列字段作为分类目录名
mkdir -p参数会自动创建不存在的目录,目录已存在时不会抛出错误- 同分类的行内容会通过管道传给gzip按指定压缩级别压缩,再流转给split按100MB大小切分,最终输出到对应分类目录下,命名规则完全匹配需求
- awk会自动维护不同分类对应的管道句柄,处理超大文件时不会占满内存,可稳定运行
- 若分类值可能包含空格、特殊字符,可使用转义版本避免路径解析错误:
awk '{d=$1; gsub(/'\''/,"'\''\\'\'''\''",d); system("mkdir -p '\''" d "'\''"); print | "gzip -5 -c | split -d -a 3 -b 100000000 - '\''" d "/" d ".gz.'\''"}' data.txt
- 可按需调整
gzip后的压缩级别数字、split -b后的分块大小数值适配不同场景。
内容的提问来源于stack exchange,提问作者user1179317
相关产品推荐
相关产品推荐

