使用“几乎”不同的标题连接多个文件

时间:2014-04-01 12:14:29

标签: bash sed awk

我试图加入几个文件,如下所示

file1

DATE;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME;
2014M01;AZ;PO; 
2013M12;WT;UF;       

file2

DATE;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM;
2014M02;BA;LA; 
2014M01;BR;ON; 

我试图合并它们以获得以下结果

DATE;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME;
2014M02;BA;LA; 
2014M01;BR;ON;AZ;PO;  
2013M12       WT;UF;   

DATE;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME;
2014M02;BA;LA;; 
2014M01;BR;ON;AZ;PO;  
2013M12;;WT;UF;   

我尝试了join,但它说filenameX is not sorted:

如果您有任何想法,欢迎他们。

最佳。

2 个答案:

答案 0 :(得分:0)

这对你有用吗?

$ awk '
BEGIN{FS=OFS=";"}
NR==FNR{a[$1]=$0;next}
{$0=($1 in a)?a[$1] $2 FS $3:$0; delete a[$1]}1;END{for(x in a) print a[x]}' file2 file1
DATE;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME
2014M01;BR;ON;AZ;PO
2013M12;WT;UF;
2014M02;BA;LA;

  • 我们将字段分隔符(输入和输出)设置为;
  • 我们扫描第一个文件并创建一个在第1列索引的数组,并为其分配整行的值
  • 第一个文件完成后,我们开始阅读第二个文件。如果我们的数组中存在第一列,我们将当前行追加到存储在数组中的行。我们删除了数组项。
  • 处理完第二个文件的所有行后,我们遍历数组以查看是否还有任何项目。如果是这样我们打印它们。

答案 1 :(得分:0)

Bash有这个很棒的功能,可以对两个文件进行内联排序:

$ join -t ';' -a 1 -a 2 -o 0 1.2 1.3 2.2 2.3 <(sort -n file1 ) <(sort -n file2)
DATE;BAL_RO,ET-CAP,EXT_EA16;LRW_RT,AY-LME;WALU-TF,TZ-AN;BAL_OP,WZ-CPI,WXZ-JUM
2013M12;WT;UF;;
2014M01;AZ;PO;BR;ON
2014M02;;;BA;LA

说明:

-t ';':使用;作为输入和输出分隔符。

-a 1 -a 2:还会从file1和file2打印无法使用的行。

-o 0 1.2 1.3 2.2 2.3:每一行格式为0(加入字段),1.2file1的第二个字段),1.3(第3个字段) file1),等等。

<(sort -n file1):通过bash进程替换进行数字排序file1

<(sort -n file2):通过bash进程替换进行数字排序file2

有关bash流程替换的详细信息,请参阅:http://tldp.org/LDP/abs/html/process-sub.html