linux - 将多个文件合并为一个文件,包括 shell 中不匹配的行

标签 linux shell join awk

文件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

下面应该是预期的历史记录。

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

使用 Join 不起作用 - 我可以按照 Ravinder 在另一个线程中建议的那样使用 2 个文件来实现:Join two files including unmatched lines in Shell

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

最佳答案

您可以使用此 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

关于linux - 将多个文件合并为一个文件,包括 shell 中不匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59396273/

相关文章:

linux - gcc 本地在主文件夹中本地安装 gcc 7.1

c - 在 x86_64 linux 中重定位超过 2GB 的程序时出现链接器错误?

linux - 如何用hadoop打印文件树?

php - 按日期顺序连接两个表并显示结果

linux - Tomcat:无法从局域网上的其他计算机连接

linux - 汇编文本编辑器

sql - 逐行比较两个不同文本文件中的两个值

linux - 简单的 Shell 脚本不会附加到文件

mysql - 如何在已准备好具有多个联接的数据库上执行之间查询?

php - 带条件的 LEFT JOIN 未返回所需的数据