首页 > 解决方案 > 如何简单地在文件中保持最新记录

问题描述

我想在 Linux 上使用 bash 在给定文件 B 的文件 A 中简单地保持最新记录。

A 和 B 文件具有相同的结构。

文件的每一行都有一条记录,由公钥和注释组成,以空格分隔。注释是 user@hostname 的组合,在文件中是唯一的。

例子:

B file
xxxxxx user1@hostname1
yyyyyy user2@hostname2
wwwwww user3@hostname3


A file
yxxxxx user1@hostname1
zzzzzz user4@hostname4
yyyyyy user2@hostname2

这应该导致:

A file
xxxxx user1@hostname1
zzzzz user4@hostname4
yyyyy user2@hostname2
wwwww user3@hostname3

我知道我可以逐行读取 B 文件并通过注释检查文件 A 是否包含记录。如果不追加记录。如果是,请检查是否更新。然而,它在 bash 脚本中演化出多行代码。

可以做得更简单吗?

标签: linuxbashfile

解决方案


一个小awk脚本

awk '
  NR == FNR {print; seen[$2]; next}
  !($2 in seen)
' A B

并将更改保存回文件 A,请选择以下之一

awk '...' A B | sponge A        # from the `moreutils` package
tmp=$(mktemp)
awk '...' A B > "$tmp" && mv "$tmp" A

推荐阅读