【问题标题】:Using Shell Script, search 2 closest, element of 2nd column in file2 for every entry of 2nd column in file1 and append elements of column1 in file1使用 Shell 脚本,在 file2 中搜索 2 最接近的第 2 列元素,以查找 file1 中第 2 列的每个条目,并在 file1 中附加第 1 列的元素
【发布时间】:2016-09-30 17:28:15
【问题描述】:

我有两个文件 file1 和 file2(空格分隔),都包含 2 列。 file1 的第 1 列和第 2 列是 Id 和权重(浮点值)。同样,file2 具有 Id1 和权重(浮点值)。使用shell命令,如何为file1中第2列的每个条目找到file2中第2列的2个最接近的不同元素,并在file1中附加column1的相应元素?

文件1

1 10.0
2 12.1
3 5.2
4 13.0 

文件2

15 11.1
10 12.3
17 2.1
12 15.5
11 7.0

预期的 o/p

1 15 10
2 10 15
3 11 17
4 10 15

【问题讨论】:

  • 你有两个用空格分隔的文件?
  • 说 f1 有 Column1:1 2 3 4 和 Column2:10.0 12.1 5.2 13.0。 f2 具有 Column1:15 10 17 12 11 和 Column2:11.1 12.3 2.1 15.5 7.0。我希望我的输出如下: f1 row1: 1 15 10 row2: 2 10 15 row3: 3 11 17. row4 : 4 10 15 12
  • 请举个例子。无法理解你想要什么。 (奇怪的好像是CodinGame的问题……)
  • 对不起@Caduchon。请参阅我最近的评论。我举了一个简单的例子。让我解释一下,file1 和 file2 仅包含 2 列(给出了示例数据)。让我们从 file1 的 row1 开始,row1 的第二个元素,即 10.0,在第 2 列中找到 2 个最接近的元素,即 file2 中的 11.1 和 12.3。因此,file1 中第 1 行的解决方案变为 1 15 10(我们可以覆盖第 1 行或放入其他文件)其中 1 是已经作为第一列给出的 id,15 和 10 是 file2 中第一列的元素对应于11.1 和 12.3(选择最近的元素)。同样,我们必须处理 file1 的其他行
  • @DevAnand :用一个清晰​​的例子编辑你的初始消息。

标签: bash shell awk


【解决方案1】:

猫文件1

1 10.0
2 12.1
3 5.2
4 13.0

猫文件2

15 11.1
10 12.3
17 2.1
12 15.5
11 7.0

命令awk -f script.awk file2 file1

script.awk

#! /bin/awk -f
function abs(val) {
    return val < 0 ? -val : val
}
ARGV[1] == FILENAME{
    a[$1] = $2;
}
ARGV[2] == FILENAME{
    inf = 2^16;;
    one=inf; diffOne=inf;
    two=inf; diffTwo=inf;
    for(i in a){
        new = abs($2 - a[i]);
        if(diffOne > new ||  diffTwo > new){
            if(diffTwo >= diffOne && diffOne > new ){
                two = one; diffTwo = diffOne;           
                one = i; diffOne = new;

            } else {
                two = i; diffTwo = new;
            }
        }
    }
    if(one == inf){
        one = ""    
    }
    if(two == inf){
        two = ""    
    }
    print $1,one,two        
}

输出

1 15 10
2 10 15
3 11 17
4 10 15

【讨论】:

  • 哇!非常感谢@chet。
猜你喜欢
  • 2022-01-11
  • 2018-08-06
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多