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

问题描述 投票:1回答:1

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

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

谢谢您的帮助。

shell csv join awk
1个回答
0
投票

输入文件:

$ 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
© www.soinside.com 2019 - 2024. All rights reserved.