我有大约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 ..所以试图尝试。
答案 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