【问题标题】:Merge sorted files without knowing file names在不知道文件名的情况下合并排序的文件
【发布时间】:2017-09-16 04:49:54
【问题描述】:

我有一个所有已排序的 gzip 文件目录。我不知道目录中有多少文件。我想将这些文件合并到一个文件中。我一直在这样做: find . -type f | xargs zcat | sort 但是,当我添加 -m 标志时,它只是将文件一个接一个地连接起来。有没有办法使用sort -m 来合并一个目录中所有排序的文件?

谢谢!

我想指出@chepner 的解决方案非常适用于非压缩文件。

【问题讨论】:

  • sort 命令不能将压缩文件作为输入。
  • sort -m 不排序;它合并其预先排序的输入文件。当您从标准输入读取时,您只有 一个 输入文件。在这种情况下,您根本不需要-m
  • 我想简单地合并文件,因为我知道它们都已排序,这可能吗?
  • 那么,例如,您有log.3.gz,其数据后面是log.2.gz,然后是log.1.gz?您的find 命令可能不会按照您期望的顺序输出文件。
  • 文件的排序顺序无关紧要。我只需要弄清楚如何进行排序以识别我正在合并许多文件,而不是一个。

标签: linux bash sorting unix gzip


【解决方案1】:

要合并预先排序的文件,您需要提供名称作为参数,而不是数据作为标准输入。假设您没有那么多个文件,只需使用

sort -m *

【讨论】:

  • 这些文件是gzipd。它可能需要构建或评估一些流程替换。
  • 是的,这就是我的问题的根源。
  • 您可以将两个 gzip 压缩文件连接在一起以生成一个更长的 gzip 文件。如果您实际上不需要排序,那么cat log*.gz > bigfile.gz 似乎就可以了。
  • echo hello > A; echo world > B; gzip A B; cat A.gz B.gz | zcat
  • 我确实需要对最终文件进行排序。
【解决方案2】:

我找到了答案!

find . -type f | awk '{print "<(gzip -cd "$0")"}' | tr "\n" " " | (echo -n sort -m " "; cat -; echo) | bash

这会查找目录中的所有文件,并将它们作为参数发送给排序命令,同时用空格替换换行符。感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多