Shell-Script用于连接目录中具有两个键列的所有CSV文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell-Script用于连接目录中具有两个键列的所有CSV文件相关的知识,希望对你有一定的参考价值。

我现在已经挣扎了一段时间。

我有一个包含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,但我没有得到它(错误的方法?)。

谢谢您的帮助。

答案

输入文件:

$ 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

以上是关于Shell-Script用于连接目录中具有两个键列的所有CSV文件的主要内容,如果未能解决你的问题,请参考以下文章

创建 2 个具有相同键列但不同包含列的非聚集索引

HQL 无法在公共外键列上连接两个表

oracle:物化视图中的主键列

具有包含性列的索引

9.数据库-查-多表操作

创建 1:n 关系时,Entity Framework Code First 在数据库中生成两个外键列