首页 > 解决方案 > 将多个文件合并到一个文件中,包括 shell 中不匹配的行

问题描述

文件 1.log

207.46.13.90  37556
157.55.39.51  34268
40.77.167.109 21824
157.55.39.253 19683

文件2.log

207.46.13.90  62343
157.55.39.51  58451
157.55.39.200 37675
40.77.167.109 21824

文件 3.log

207.46.13.90  85343
157.55.39.51  59876
157.55.39.200 37675
157.55.39.253 19683

下面应该是预期的 history.log

207.46.13.90    37556   62343   85343
157.55.39.51    34268   58451   59876
157.55.39.200   -----   37675   37675
40.77.167.109   21824   21824   -----
157.55.39.253   19683   -----   19683

使用加入不起作用-我可以按照 Ravinder 在另一个线程中的建议获得 2 个文件:加入两个文件,包括 Shell 中不匹配的行

此外,在下一次运行中,我会将另一个 file4.log 添加到说 history.log 作为第 4 列。提前致谢。

标签: linuxshelljoinawk

解决方案


您可以使用它gnu awk来组合具有与第一列值相同的键的多个文件:

awk -v OFS='\t' '{
   a[$1][ARGIND] = $2
}
END {
   for (i in a) {
      printf "%s", i
      for (j=1; j<ARGC; j++)
         printf "%s", OFS (j in a[i] ? a[i][j] : "-----")
      print ""
   }
}' File*.log

207.46.13.90    37556   62343   85343
40.77.167.109   21824   21824   -----
157.55.39.51    34268   58451   59876
157.55.39.253   19683   -----   19683
157.55.39.200   -----   37675   37675

推荐阅读