首页 > 解决方案 > 如果使用 AWK 未找到匹配项,则运行命令

问题描述

我有两个文件需要在第一列中运行比较。

文件 1

User1, misc info, stuff
User2, misc info stuff2
User3, misc info, more stuff

文件2

User4, misc info, more stuff
User2, misc info, different stuff

首先,我需要测试 File2 中的 col1 值。如果 File1 中不存在 col1 File2 值,则删除该行。所以在第一次操作之后,第二个文件应该是这样的:

第一次操作后的文件2:

User2, misc info, different stuff

之后,我需要测试 File1 中的 col1 值。如果 File2 中不存在 col1 File1 值,则需要将 File1 中的整行附加到 File2。完成此操作后,第二个文件应如下所示:

第二次操作后的File2:

User2, misc info, different stuff
User1, misc info, stuff
User3, misc info, more stuff

我在网上看到很多 awk 的例子,但很多都是关于寻找匹配的,而不是缺少的。我对 awk 也很陌生,所以如果你能为我分解你的回应,我会非常感激。

让我知道是否有任何不清楚的地方,或者是否有一个线程涵盖了这个!

标签: awktext-processing

解决方案


awk '
NR==FNR { a[$1]=$0; next;}
$1 in a { delete a[$1]; print;}
END { for (key in a){print a[key]} }
' file1 file2

解释:

NR==FNR { a[$1]=$0; next;} 从 File1(NR==FNR) 创建数组,其中键是第一列 ($1),值是整行 ($0)。

$1 in a { delete a[$1]; print;}将 File2 与先前创建的数组匹配,删除条目并打印行。

END { for (key in a){print a[key]} }打印数组中所有剩余的条目。

将输出写入file2:

temp=$(mktemp)
awk '...' file1 file2 > "$temp"
mv "$temp" file2

您不应该就地写入 file2,只需创建临时文件,然后将其移动到 file2 路径。


推荐阅读