bash - 按行号交叉引用两个文件中的字符串并将它们收集到第三个文件中
问题描述
我有两个文件,我希望将它们协调到一个文件中以绘制 xy 图。
File1 在每一行包含一个不同的 x 值,然后是同一行上的一系列 y 值。File2 包含我需要的 File1 中每个点 x 的特定 y 值。
实际上,我有 50,000 行和 50-100 列,但这是一个简化的示例。
File1 如下所示:
1 15 2 3 1
2 18 4 6 5
3 19 7 8 9
4 23 10 2 11
5 25 18 17 16
- 第 1 列是行号。
- 第 2 列是我的 x 值,按升序排序。
- 第 3-5 列是我的 y 值。它们不是唯一的;一行上的 ay 可以匹配另一行上的 ay。
File2 如下所示:
3
5
2
18
File2 中每一行上的 y 对应于与 File1 中同一行中的一个 y 匹配的数字(对于前几百行)。在前几百行之后,它们可能并不总是匹配。因此,File2 的行数少于 File1。我想要么忽略这些行,要么用 0 填充它。
目标
输出 File3 应包括:
15 3
18 5
19 0
23 2
25 18
或与
19 0
删除,以适用于脚本的为准。如果这两个选项都不可能,那么我也可以只逐行匹配 y 值,直到没有匹配,然后停在那里。
尝试
我最初将 File2 路由到一个数组中:
a=( $(grep -e '14,12|:*' File0 | cut -b 9-17) )
但后来我注意到 Stackexchange 上的类似问题(1、2)使用了第二个文件,因此我将上述 grep 命令路由到 File2 中。
这些问题略有不同,因为我需要 File1 中的特定列,但我认为我至少可以将它们用作起点。这些问题的解决方案:
1)
grep -Fwf File2 File1
当然复制了 File1 中的整行,我不知道如何从那里开始;或者
2)
awk 'FNR==NR {arr[$1];next} $1 in arr' File2 File1
对我来说完全失败了,除了一般的 awk 帮助响应之外没有错误消息。
这可能吗?谢谢你。
解决方案
awk 'NR==FNR { arr[NR] = $1; next } {
for (i = 3; i <= NF; ++i) {
if ($i == arr[n]) {
print $2, $i
n++
next
}
}
print $2, 0
}' n=1 file2 file1
推荐阅读
- sql - 滚动总和取决于另一列值
- bash - zsh throw 警告:此脚本已弃用,请参阅 git-completion.zsh
- javascript - 我的 Codewars 脚本未通过测试 ..?(系列中最大的 5 位数字)
- java - Netty 4.1:防止在服务器异常上发送 TCP ACK
- git - Git推送完全停止
- javascript - 如果我有 calendarID,部署脚本以更改其他用户的 Google 日历的最佳方式是什么?
- android - 辅助应用程序的 FirebaseMessaging.getInstance(firebaseApp) 应该是公共的,但它是私有的?
- r - map 函数如何知道在调用其缩写 (Ad) 时隔离调整后的列?
- angular - Angular 9 / Nativescript 6 代码共享应用程序不是为移动设备构建的 - 怀疑是 SASS 问题:
- c - 在 C 中,malloc 如何确定何时为新分配回收释放的空间?