首页 > 解决方案 > 按行号交叉引用两个文件中的字符串并将它们收集到第三个文件中

问题描述

我有两个文件,我希望将它们协调到一个文件中以绘制 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 
 

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 上的类似问题(12)使用了第二个文件,因此我将上述 grep 命令路由到 File2 中。

这些问题略有不同,因为我需要 File1 中的特定列,但我认为我至少可以将它们用作起点。这些问题的解决方案:

1)

        grep -Fwf File2 File1

当然复制了 File1 中的整行,我不知道如何从那里开始;或者

2)

  awk 'FNR==NR {arr[$1];next} $1 in arr' File2 File1

对我来说完全失败了,除了一般的 awk 帮助响应之外没有错误消息。

这可能吗?谢谢你。

标签: bashshellawk

解决方案


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

推荐阅读