【问题标题】:Shell-Script to join all CSV files in directory with two key-columns使用两个键列加入目录中所有 CSV 文件的 Shell 脚本
【发布时间】:2018-06-25 09:31:11
【问题描述】:

我现在挣扎了一段时间。

我有一个包含 5 个以上 CSV 文件的目录。我们的想法是用一个脚本将它们全部连接起来(也许用一个循环?)。

只有两个文件的示例:

文件1

1   ;   1.1   ; xyz
1   ;   1.2   ; abc
2   ;   2.1   ; gfa

文件2

1   ;   1.1   ; dft
1   ;   1.2   ; asd
2   ;   2.1   ; qwe

输出文件应如下所示:

1   ;   1.1   ;   xyz    ; dft
1   ;   1.2   ;   abc    ; asd
2   ;   2.1   ;   gfa    ; qwe

在每个 CSV 文件中,前两列是“主键”。我已经用 join 和 awk 试过了,但我不明白(错误的方法?)。

感谢您的帮助。

【问题讨论】:

  • 添加您尝试质疑的连接/awk 代码...关于示例,我建议添加至少一行不带特征单元格的行。此外,行的顺序总是相同吗?如果是这样,您可以简单地将文件粘贴在一起并使用 cut 来仅获取最后一个字段..
  • 例如:pr -mts' ;' file1 <(cut -d';' -f3 file2)
  • 并且,将来,您将希望在每行代码/数据/错误消息的前面使用 4 个空格,或者突出显示一个文本块并使用{} 格式工具编辑框的左上角以格式化为代码/数据/输出。有关详细信息,请参阅 editing-helpformatting。祝你好运。

标签: shell csv join awk


【解决方案1】:

输入文件:

$ cat featureA 
SW1 ; 1.1 ; xyz
SW1 ; 1.2 ; abc
SW2 ; 2.1 ; gfa

$ cat featureB
SW1 ; 1.1 ; dft
SW1 ; 1.2 ; asd
SW2 ; 2.1 ; qwe

输出:

awk 'BEGIN{FS=OFS=";"}{k=$1 OFS $2}FNR==NR{arr[k]=$3;next}k in arr{print k,arr[k],$3}' featureA featureB
SW1 ; 1.1 ; xyz; dft
SW1 ; 1.2 ; abc; asd
SW2 ; 2.1 ; gfa; qwe

致辞

我有一个包含 5 个以上 CSV 文件的目录。这个想法是把 此目录中的几个 CSV 并运行脚本将它们全部加入(也许 有一个循环?)。这些文件是关于开关的。

$ awk 'BEGIN{FS=OFS=";"}{k=$1 OFS $2}{arr[k]=(k in arr?arr[k] OFS:"")$3}END{for(i in arr)print i, arr[i]}' feature*
SW1 ; 1.1 ; xyz; dft
SW1 ; 1.2 ; abc; asd
SW2 ; 2.1 ; gfa; qwe

说明:

awk 'BEGIN{
        FS=OFS=";"                    # i/p and o/p field separators
     }
     {
        k=$1 OFS $2                   # variable k used as key, 
                                      # field1 o/p field sep and field2
     }
     FNR==NR{                         # read featureA file 
        arr[k]=$3;                    # save 3rd field in array arr, with key being variable k 
        next                          # go to next
     }                
     k in arr{                        # read featureB file, if key exists in array arr
        print k,arr[k],$3             # print k, array value, and 3rd field
     }
    ' featureA featureB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多