Linux 合并排序压缩文件

Linux 合并排序压缩文件,linux,bash,unix,Linux,Bash,Unix,我有40个2GB的文件,存储在NFS体系结构上。每个文件包含两列:数字id和文本字段。每个文件都已排序和压缩 如何合并所有这些文件,以便对结果输出进行排序 我知道排序-m-k1应该对未压缩的文件起作用,但我不知道如何直接对压缩的文件起作用 PS:我不想要将文件解压缩到磁盘、合并并再次压缩的简单解决方案,因为我没有足够的磁盘空间来进行压缩。确实有zgrep和其他常用工具可以处理压缩文件,但是在这种情况下,您需要对未压缩的数据进行排序/合并,并压缩结果。#/bin/bash #!/bin/b

我有40个2GB的文件,存储在NFS体系结构上。每个文件包含两列:数字id和文本字段。每个文件都已排序和压缩

如何合并所有这些文件,以便对结果输出进行排序

我知道排序-m-k1应该对未压缩的文件起作用,但我不知道如何直接对压缩的文件起作用


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