使用UNIX AWK或JOIN合并多个文件

时间:2014-11-25 15:03:10

标签: unix join awk

我有大约12个文件..很少有像

档案1

aaaaa 10/25/2012 10/30/2012
aaaaa 10/30/2012 11/15/2013
aaaaa 11/15/2013 07/04/2013
bbbbb 06/06/2013 04/08/2014
ccccc 01/01/2014 06/09/2014

文件2

aaaaa 10/25/2012 10/30/2012
aaaaa 10/30/2012 11/15/2013
aaaaa 11/15/2013 07/04/2013
bbbbb 06/06/2013 04/08/2014

文件3

aaaaa 10/25/2012 10/30/2012
aaaaa 11/15/2013 07/04/2013
bbbbb 06/06/2013 04/08/2014
ccccc 01/01/2014 06/09/2014

.....

文件9

aaaaa
bbbbb
ccccc

文件10

aaaaa
bbbbb

文件11

aaaaa
ccccc

全部排序。文件1就像一个主文件。我想将文件1与三列上的文件2进行比较。文件1包含文件3..etc ..直到文件8.从文件9到11,我想在file1上与文件9进行比较,例如在第一列上。

我想要这样的输出

我想要这样的输出(请参阅附件更好)

id     date1        date2          existFile2    existFile3............................existFile9.....existFile10.......existfile11
aaaaa 10/25/2012 10/30/2012        Y             Y                                     Y          Y                  Y
aaaaa 10/30/2012 11/15/2013        Y             N                                     Y              Y                  Y
aaaaa 11/15/2013 07/04/2013        Y             Y                                     Y              Y                  Y
bbbbb 06/06/2013 04/08/2014        Y             Y                                     Y              Y                  N
ccccc 01/01/2014 06/09/2014        N             Y                                     Y              N                  Y    

我是awk的新手,加入了unix ..所以试图尝试。

1 个答案:

答案 0 :(得分:1)

我的解决方案是以下awk代码(将其放在'merge.awk'文件中):

(NR == FNR) {keys[$0] = $0}

(NR != FNR) && ($0 in keys) {
  result[FILENAME $0] = "Y"
}

END {
  printf("                      ")
  for (i = 1; i < ARGC; i++) {
    printf("%s   ",ARGV[i])
  }
  printf("\n")

  for (key in keys) {
    printf("%s     ", key)
    for (i = 2; i < ARGC; i++) {
      r = result[ARGV[i] key]
      if (r == "") r = "N"
      printf("%s       ",r)
    }
    printf("\n")
  }
}

关键概念是使用NR == FNR条件区分第一个文件中的记录与其他文件。请参阅this manual以供参考。然后我使用awk数组来完成繁重的工作; - )

我使用以下文件来测试我的解决方案:

::::::::::::::
file1
::::::::::::::
aaaaa 10/25/2012 10/30/2012
aaaaa 10/30/2012 11/15/2013
aaaaa 11/15/2013 07/04/2013
bbbbb 06/06/2013 04/08/2014
ccccc 01/01/2014 06/09/2014
::::::::::::::
file2
::::::::::::::
aaaaa 10/25/2012 10/30/2012
aaaaa 10/30/2012 11/15/2013
aaaaa 11/15/2013 07/04/2013
bbbbb 06/06/2013 04/08/2014
::::::::::::::
file3
::::::::::::::
aaaaa 10/25/2012 10/30/2012
aaaaa 11/15/2013 07/04/2013
bbbbb 06/06/2013 04/08/2014
ccccc 01/01/2014 06/09/2014
::::::::::::::
file4
::::::::::::::
aaaaa
bbbbb
ccccc

因此命令awk -f merge.awk file1 file2 file3 file4应该给出以下结果:

                      file1   file2   file3   file4   
aaaaa 11/15/2013 07/04/2013     Y       Y       N       
aaaaa 10/30/2012 11/15/2013     Y       N       N       
aaaaa 10/25/2012 10/30/2012     Y       Y       N       
bbbbb 06/06/2013 04/08/2014     Y       Y       N       
ccccc 01/01/2014 06/09/2014     N       Y       N