连接多个压缩文件,跳过除第一个文件之外的所有文件中的标题行

Set*_*ton 5 gzip shell-script tail text-processing cat

我有一组 gzip 压缩文件,我想将它们组合成一个文件。它们各自具有相同的格式。我想仅保留第一个文件的标头信息,并在后续文件中跳过它。

\n\n

举一个简单的例子,我有四个相同的文件,其内容如下:

\n\n
$ gzcat file1.gz\n# header\n1\n2\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想结束

\n\n
# header\n1\n2\n1\n2\n1\n2\n1\n2\n
Run Code Online (Sandbox Code Playgroud)\n\n

实际上,我可以拥有不同数量的文件,因此我希望能够以编程方式执行此操作。这是我迄今为止拥有的非编程解决方案......

\n\n
cat <(gzcat file1.gz) <(tail -q -n +2 <(gzcat file2.gz) <(gzcat file3.gz) <(gzcat file4.gz))\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个命令有效,但它是 \xe2\x80\x9chard 编码的 \xe2\x80\x9d 来处理四个文件,\n我需要将它概括为任意数量的文件。\xc2\xa0\n我使用作为bash外壳,如果这有帮助。我的偏好是性能(实际上文件可能有数百万行长),所以如果速度很快,我可以接受不太优雅的解决方案。

\n

G-M*_*ca' 1

如果您在问题中显示的命令基本上有效(对于硬编码的文件数量),那么

\n\n
first=1\nfor f in file*.gz\ndo\n    if [ "$first" ]\n    then\n        gzcat "$f"\n        first=\n    else\n        gzcat "$f"| tail -n +2\n    fi\ndone > collection_single_file\n
Run Code Online (Sandbox Code Playgroud)\n\n

应该适合你。\xc2\xa0\n我希望逻辑相当清晰。\xc2\xa0\n查看所有文件(根据你的文件名更改通配符)。\xc2\xa0\nIf\xc2\xa0it \xe2\x80\x99 是列表中的第一个,gzcat它,因此您将获得整个文件\n(包括标头)。\xc2\xa0\n否则,请使用tail剥离标头。\xc2\xa0\n在您\n之后xe2\x80\x99已经处理了一个文件,那么其他文件将不会是第一个。

\n\n

这会调用tail N \xe2\x88\x921 次,而不是仅仅一次(如您的答案)。\xc2\xa0\n除此之外,我的答案应该与您的答案执行相同的操作。

\n