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\ncat <(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\nfirst=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已经处理了一个文件,那么其他文件将不会是第一个。
这会调用tail
N \xe2\x88\x921 次,而不是仅仅一次(如您的答案)。\xc2\xa0\n除此之外,我的答案应该与您的答案执行相同的操作。