【问题标题】:merge two csv file in linux在linux中合​​并两个csv文件
【发布时间】:2017-09-14 17:16:34
【问题描述】:

我正在尝试通过以下方式将两个 csv 文件合并为一个文件。 第一个文件:包含所有数据。 第二个文件:包含更新的数据。

所以结果文件应该包含所有通过第二个文件数据修改的行的数据..

示例:

file1:
1,Hello,123
2,Hello,456
3,Bye,789

file2:
1,Hello,123
3,Hello,789
4,Bye,345

resulted file:
1,Hello,123
2,Hello,456
3,Hello,789
4,Bye,345

应添加所有新条目,不应删除旧条目,任何更新的条目都应更新结果。

我正在通过一些 shell 脚本寻找一些更简单的解决方案。

提前致谢。 :)

【问题讨论】:

  • 您是否缺少换行符?
  • 缺少换行符?如果需要,我可以在预处理文件中添加它
  • NM,有人编辑了您的问题。请注意他们做了什么——这就是它的样子。任何语言都可以还是 bash/csh?
  • 好的,知道了。是的,应该是这样的
  • 其实我已经有了 shell 脚本,所以通过 shell 本身寻找一些 unix 命令或解决方案

标签: linux csv text-processing


【解决方案1】:

您需要更好地定义术语“数据更新”。

如果你的文件 1 有这一行

3,再见,789

文件 2 有这些行

3,你好,789

4,再见,345

那么你需要指定什么被认为是“更新的”。第一个数字是您的数据键吗?单词是关键吗?案件重要吗?最后一个数字是你的钥匙吗?

然后你指定

不应删除旧条目

但您的结果文件不包含该行

3,再见,789

很明显,您希望删除数据。

一旦您更好地定义了您的标准,您就可以开始编写解决方案了。

【讨论】:

  • 第一个数字是我的钥匙。如果密钥存在于第二个文件中,则应更新旧条目。对于这些文件,结果应该是这样的: 3,Hello,789 4,Bye,345 (3 在两个文件中,在这种情况下最终结果中应该有第二个文件数据)
  • 这不是答案,我认为您应该将其移至 cmets。
【解决方案2】:

假设文件中的第一个元素是关键,您可以使用awk 这样做:

parse.awk

BEGIN { FS = OFS = "," }

FNR == NR { 
  h[$1] = $0
  next
} 

{ h[$1] = $0 }

END { 
  for(k in h)
    print h[k]
}

像这样运行它:

awk -f parse.awk file1 file2

或者作为单行:

awk 'FNR==NR{h[$1]=$0;next} {h[$1]=$0}END{for(k in h)print h[k]}' FS=, OFS=, file1 file2

两种情况下的输出:

1,Hello,123
2,Hello,456
3,Hello,789
4,Bye,345

【讨论】:

    猜你喜欢
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多