Bash 用“连接多个文件”;几乎是";不同的标题

Bash 用“连接多个文件”;几乎是";不同的标题,bash,sed,awk,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_

我正在尝试加入几个文件,如下所示

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;   

我尝试了
join
,但它说
filenameX没有排序:

如果你有任何想法,欢迎提出


最好。

这对您有用吗:

$ 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列创建一个索引数组,并为其指定整行的值
  • 第一个文件完成后,我们开始读取第二个文件。如果数组中存在第一列,则将当前行附加到数组中存储的行。我们删除数组项
  • 处理完第二个文件的所有行后,我们循环遍历数组以查看是否还有剩余的项。如果是这样的话,我们就把它们打印出来
      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
      

      $join-t';'-a 1-a 2-o 0 1.2 1.3 2.2 2.3我想在
      file1
      中添加一个空行,但是我仍然很难使用file 2.OMG进行
      连接
      !你能解释一下吗,杰帕尔?“我需要买一个月前我答应自己要买的那本awk书,因为我今天已经拿到了报酬。”安迪克补充道。希望有帮助!问题Jaypal:如果文件有很多头文件,每个头文件都有,而不是像我在示例中所显示的那样只有3个头文件,那么它能工作吗?@AndyK它应该工作。如果你有4个或5个标题,你可以像我上面所显示的那样填充它们。如果你有100个,那么这将是乏味的,需要一个不同的方法。使用
      for loop
      迭代所有字段或
      sub()
      删除第一个字段etcHi Gerrit,感谢您的回答。请你再解释一下好吗?我可以说1.2 1.3 2.2 2.3是列名称吗?如果是,是否意味着必须手动输入?干杯,干杯,Gerrit。这很有帮助,我想我可以自动化。在列部分,这将有点棘手,但仍然可行。我试图省略
      -o…
      选项。根据手册,它应该给出期望的结果:
      默认格式输出连接字段、文件1中的剩余字段、文件2中的剩余字段,
      ,但遗憾的是,这不起作用:结果中忽略了连接字段:-(可能是
      连接中的错误)。
      
      $ 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