awk - 如果使用 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 也很陌生,所以如果你能为我分解你的回应,我会非常感激。
让我知道是否有任何不清楚的地方,或者是否有一个线程涵盖了这个!
解决方案
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 路径。
推荐阅读
- networking - VLAN 中继
- javascript - Sails js - 语言环境
- mifare - Taplinx:InvalidResponseLengthException:desfire EV1 卡上的 readData
- ios - 为什么应用程序因 NSBluetoothPeripheralUsageDescription 键的“Info.plist 文件中缺少目的字符串”而被拒绝?
- react-native - 带有本机基本按钮的裁剪图标
- python-3.x - 将不同命名的列合并为一列,填充 NaN
- excel - 无法在spring boot rest控制器中的响应实体中获取excel文件
- android - 华为设备不导入数据库
- reactjs - 登录成功后Reactjs路由到主页
- python - 该函数在python中无法正常工作