合并2个文件,然后连接列

时间:2017-03-06 07:05:45

标签: shell csv join awk concatenation

我正在处理第一列关联的sort,join和awk 2 csv文件(分号分隔符)。

File1.csv:

TL_01;labelSD1;PFL_11  
TL_01;labelSD1;PFL_12  
TL_01;labelSD1;PFL_13  
TL_02;labelSD3;PFL_04  
TL_03;labelSD4;PFL_05 

File2.csv:

TL_01;labelRT1;JV_111  
TL_02;labelRT3;JV_02  
TL_03;labelRT4;JV_03  

我想合并这两个文件并将File1.csv中第三列的多个值连接到一个列中,并使用此模型后跟'#'分隔符:

RightMerge.csv:

TL_01;labelSD1;PFL_11#PFL_12#PFL_13;labelRT1;JV_111  
TL_02;labelSD3;PFL_04;labelRT3;JV_02  
TL_03;labelSD4;PFL_05;labelRT4;JV_03

实际上,我能够合并2个文件,但不能使用以下命令将多个值与特定字符(#)连接起来(文件已经按第一列排序):

join -11 -21 File1.csv File2.csv -t ';' > FileOut.csv

这给出了以下结果:

FileOut.csv:

TL_01;labelSD1;PFL_11;labelRT1;JV_111  
TL_01;labelSD1;PFL_12;labelRT1;JV_111  
TL_01;labelSD1;PFL_13;labelRT1;JV_111  
TL_02;labelSD3;PFL_04;labelRT3;JV_02  
TL_03;labelSD4;PFL_05;labelRT4;JV_03

在此之后,我尝试使用awk脚本来连接前三行,如下所示:

TL_01;labelSD1;PFL_11#PFL_12#PFL_13;labelRT1;JV_111

但我没有找到解决方法。 我应该继续进行awk治疗还是有另一种方法可以做到这一点?

2 个答案:

答案 0 :(得分:0)

$ cat tst.awk
BEGIN { FS=OFS=";" }
NR==FNR { key2val[$1] = ($1 in key2val ? key2val[$1] "#" $3 : $0); next }
{ print key2val[$1], $2, $3 }

$ awk -f tst.awk file1 file2
TL_01;labelSD1;PFL_11#PFL_12#PFL_13;labelRT1;JV_111
TL_02;labelSD3;PFL_04;labelRT3;JV_02
TL_03;labelSD4;PFL_05;labelRT4;JV_03

它仅假设您发布的样本输入数据真实代表您的真实数据,例如每个键值都存在于两个文件等中。如果情况并非如此,则编辑您的问题以显示更具真实代表性的样本输入/输出。

答案 1 :(得分:0)

你也可以尝试这个,

cat FileOut.csv | 
       awk '
       BEGIN{
             FS=OFS=SUBSEP=";"
       }
       NF>1{
             a[$1,$2,$4,$5] = a[$1,$2,$4,$5]";"$3
       }
       END{
             for(i in a){
                  split(i,arr,";");
                  print arr[1]";"arr[2]";"a[i]";"arr[3]";"arr[4]
                  }
       }' | 
sort

检查