如何解决将一个大的 gz 文件拆分成更小的文件过滤和分发内容
我解压了一个大小为 81G 的 gzip 文件,未压缩文件的大小为 254G。我想实现一个 bash 脚本,它接受 gzip 文件并在第一列的基础上拆分它。第一列的值范围在 1-10 之间。我想将文件拆分为 10 个子文件,其中第一列中值为 1 的所有行都放入 1 个文件中。第一列中值为 2 的所有行都放入第二个文件中,依此类推。当我这样做时,我不想将第 3 列和第 5 列放在新的子文件中。该文件也是制表符分隔的。例如:
col_1 col_2. col_3. col_4. col_5. col_6
1. 7464 sam. NY. 0.738. 28.9
1. 81932. Dave. NW. 0.163. 91.9
2. 162. Peter. SD. 0.7293. 673.1
3. 7193. Ooni GH. 0.746. 6391
3. 6139. Jess. GHD. 0.8364. 81937
3. 7291. Yeldish HD. 0.173. 1973
上面的文件将生成三个不同的 gzipped 文件,以便从每个新子文件中删除 col_3 和 col_5。我所做的是
#!/bin/bash
#SBATCH --partition normal
#SBATCH --mem-per-cpu 500G
#SBATCH --time 12:00:00
#SBATCH -c 1
awk -F,'{print > $1".csv.gz"}' file.csv.gz
但这并没有产生预期的结果。另外我不知道如何从新的子文件中删除 col_3 和 col_5 。 就像我说的 gzip 文件是 81G,因此,我正在寻找一个有效的解决方案。将不胜感激。
解决方法
你必须解压和重新压缩;要去掉第 3 列和第 5 列,您可以像这样使用 GNU cut
:
gunzip -c infile.gz \
| cut --complement -f3,5 \
| awk '{ print | "gzip > " $1 "csv.gz" }'
或者你可以去掉 awk 中的列:
gunzip -c infile.gz \
| awk -v OFS='\t' '{ print $1,$2,$4,$6 | "gzip > " $1 "csv.gz" }'
,
类似的东西
zcat input.csv.gz | cut -f1,2,4,6- | awk '{ print | ("gzip -c > " $1 "csv.gz") }'
解压文件,删除字段3和5,根据第一列保存到相应的压缩文件中。
,如果文件始终按示例中所示的第一个字段排序,则可以使用任何 awk 稳健且可移植:
gunzip -c infile.gz |
awk '
{ $0 = $1 OFS $2 OFS $4 OFS $6 }
NR==1 { hdr = $0; next }
$1 != prev { close(gzip); gzip="gzip > \047"$1".csv.gz\047"; prev=$1 }
!seen[$1]++ { print hdr | gzip }
{ print | gzip }
'
否则:
gunzip -c infile.gz |
awk 'BEGIN{FS=OFS="\t"} {print (NR>1),NR,$0}' |
sort -k1,1n -k3,3 -k2,2n |
cut -f3- |
awk '
{ $0 = $1 OFS $2 OFS $4 OFS $6 }
NR==1 { hdr = $0; next }
$1 != prev { close(gzip); gzip="gzip > \047"$1".csv.gz\047"; prev=$1 }
!seen[$1]++ { print hdr | gzip }
{ print | gzip }
'
第一个awk在前面加一个数字,保证在sort
阶段header行排在前面,加上行号,使原始第一个字段值相同的行保持原来的输入顺序.然后我们按照第一个字段进行排序,然后将第一步添加的2个字段剪掉,然后使用awk健壮且可移植地创建单独的输出文件,确保每个输出文件都以header的副本开头。我们在执行过程中关闭每个输出文件,这样脚本就可以使用任何 awk 来处理任意数量的输出文件,并且即使是使用 GNU awk 处理大量输出文件时也可以高效地工作。它还确保每个输出文件名都被正确引用,以避免出现通配符、分词和文件名扩展。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。