【问题标题】:Bash script to join two csv files by a similar field and output to third field通过类似字段连接两个 csv 文件并输出到第三个字段的 Bash 脚本
【发布时间】:2019-07-24 15:26:11
【问题描述】:

我有 2 个 csv 文件。具有以下字段名称的 file1.csv 和 file2.csv

file1.csv: 用户 ID,电子邮件

file2.csv: user_id, first_name, second_name

我创建了一个 bash 脚本来合并两个 csv 文件:

#!/bin/bash

#Script to merge two csv files based on user_id


join --header -t, <(sort -t, -k1 file_a.csv) <(sort -t, -k1 file_b.csv) > file3.csv

唯一的问题是输出将列名 user_id、email、first_name、last_name 从底部开始 3 行与数据混合在一起。任何人都知道我应该如何更正此问题以使字段名称回到顶部?

【问题讨论】:

    标签: linux bash csv join merge


    【解决方案1】:

    您的排序将标题与数据混合在一起,不幸的是排序没有 忽略标题 选项。 awk 来救场了!

    先定义一个函数

    $ function sorth() { awk 'NR==1; NR>1{print | "sort"}' "$1"; }
    

    现在可以了

    $ join --header -t, <(sorth file1) <(sorth file2)
    

    注意我不认为使用 -k1 进行排序在这里增加了任何价值,但在您的语言环境中可能会有所不同。如果是这样,请在 awk 脚本中添加选项。

    【讨论】:

      【解决方案2】:

      你可以简单地写:

      join --header -t, <(
          { read;echo $REPLY;sort -t, -k1;}<file_a.csv
        ) <(
          { read;echo $REPLY;sort -t, -k1;}<file_b.csv
        ) > outputfile.csv
      

      或者你可以创建一个函数:

      hsort() {
          {
              read
              echo $REPLY
              sort -t, -k1
          } < "$1"
      }
      

      然后

      join --header -t, <(hsort file_a.csv) <(hsort file_b.csv) >outputfile.csv
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 1970-01-01
        • 2015-04-17
        相关资源
        最近更新 更多