【问题标题】:How to merge two GZIP files, while removing the first row from the second file?如何合并两个 GZIP 文件,同时从第二个文件中删除第一行?
【发布时间】:2020-06-12 08:33:55
【问题描述】:

我有两个gzip CSV 文件,每个文件都有这些解压后的内容:

a,1
b,2
c,3

如何使用 bash 函数以从第二个文件中删除第一行的方式合并它们,以便获得此输出?最好我可以在不解压缩任何一个输入文件的情况下做到这一点。

a,1
b,2
c,3
b,2
c,3

我已经知道如何处理非 gzip 文件:

function merge_files { 
   cat "$1" <(tail +2 "$2") > "$3"; 
}

【问题讨论】:

  • 你不能;标题是赋予文件其余部分含义的原因。或者,换句话说,每个文件的压缩模式是不同的,并且在标头中进行了编码。在一个(弱)类比中,这就像试图将一个法语文件和一个中文文件粘贴在一起,并期待一个清晰的斯瓦希里语出来。解压和重新压缩不是可选的:gzcat file1.gz file2.gz | gzip &gt; file.out
  • 我一定是误用了“header”这个词。我指的是解压后数据的第一行(在本例中为a,1)。
  • 啊哈哈,我的错。你没有滥用它,它只是模棱两可。 :) 但重点仍然存在,减压不是可选的。

标签: bash csv merge gzip cat


【解决方案1】:

只需对您的代码进行最小的更改:

function merge_files { 
   cat <(gzcat "$1") <(gzcat "$2" | tail +2) | gzip > "$3"; 
}

function merge_files { 
   (
      gzcat "$1";
      gzcat "$2" | tail +2
   ) | gzip > "$3"; 
}

【讨论】:

    猜你喜欢
    • 2017-06-03
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多