Linux 合并排序压缩文件
我有40个2GB的文件,存储在NFS体系结构上。每个文件包含两列:数字id和文本字段。每个文件都已排序和压缩 如何合并所有这些文件,以便对结果输出进行排序 我知道排序-m-k1应该对未压缩的文件起作用,但我不知道如何直接对压缩的文件起作用Linux 合并排序压缩文件,linux,bash,unix,Linux,Bash,Unix,我有40个2GB的文件,存储在NFS体系结构上。每个文件包含两列:数字id和文本字段。每个文件都已排序和压缩 如何合并所有这些文件,以便对结果输出进行排序 我知道排序-m-k1应该对未压缩的文件起作用,但我不知道如何直接对压缩的文件起作用 PS:我不想要将文件解压缩到磁盘、合并并再次压缩的简单解决方案,因为我没有足够的磁盘空间来进行压缩。确实有zgrep和其他常用工具可以处理压缩文件,但是在这种情况下,您需要对未压缩的数据进行排序/合并,并压缩结果。#/bin/bash #!/bin/b
PS:我不想要将文件解压缩到磁盘、合并并再次压缩的简单解决方案,因为我没有足够的磁盘空间来进行压缩。确实有zgrep和其他常用工具可以处理压缩文件,但是在这种情况下,您需要对未压缩的数据进行排序/合并,并压缩结果。
#/bin/bash
#!/bin/bash
FILES=file*.gz # list of your 40 gzip files
# (e.g. file1.gz ... file40.gz)
WORK1="merged.gz" # first temp file and the final file
WORK2="tempfile.gz" # second temp file
> "$WORK1" # create empty final file
> "$WORK2" # create empty temp file
gzip -qc "$WORK2" > "$WORK1" # compress content of empty second
# file to first temp file
for I in $FILES; do
echo current file: "$I"
sort -k 1 -m <(gunzip -c "$I") <(gunzip -c "$WORK1") | gzip -c > "$WORK2"
mv "$WORK2" "$WORK1"
done
FILES=file*.gz#您的40个gzip文件列表
#(例如file1.gz…file40.gz)
WORK1=“merged.gz”#第一个临时文件和最后一个文件
WORK2=“tempfile.gz”#第二个临时文件
>“$WORK1”#创建空的最终文件
>“$WORK2”#创建空临时文件
gzip-qc“$WORK2”>“$WORK1”#压缩空秒的内容
#文件到第一个临时文件
在$file中为I;做
回显当前文件:“$I”
sort-k1-m这是进程替换的一个用例。假设您有两个文件要排序,sorta.gz
和sortb.gz
。您可以使用在单个管道中添加不同风格的多文件合并,为这两个文件提供gunzip-c FILE.gz
的输出进行排序-它在$OUT/uniques
中获取所有(预排序)文件,排序合并它们并压缩输出,使用lz4是因为它的速度:
find $OUT/uniques -name '*.lz4' |
awk '{print "<( <" $0 " lz4cat )"}' |
tr "\n" " " |
(echo -n sort -m -k3b -k2 " "; cat -; echo) |
bash |
lz4 \
> $OUT/uniques-merged.tsv.lz4
find$OUT/uniques-名称'*.lz4'|
awk{print“可以开发一个程序,打开所有文件,一次解压一个块,合并排序数据,输出结果(如果需要,可以进行压缩),并根据需要推进每个输入-但这种努力的范围超出了这里的简单答案。@AndrewMedico记录,这不是真的-sort
正是这样一个程序,bash
可以很容易地将其与gunzip
结合起来。有关详细信息,请参阅答案。
cmd="sort -m -k1 "
for input in file1.gz file2.gz file3.gz ...; do
cmd="$cmd <(gunzip -c '$input')"
done
eval "$cmd" >sorted # or eval "$cmd" | gzip -c > sorted.gz
find $OUT/uniques -name '*.lz4' |
awk '{print "<( <" $0 " lz4cat )"}' |
tr "\n" " " |
(echo -n sort -m -k3b -k2 " "; cat -; echo) |
bash |
lz4 \
> $OUT/uniques-merged.tsv.lz4