Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用Shell脚本,搜索file2中第二列的2个最近元素,查找file1中第二列的每个条目,并在file1中追加column1的元素_Bash_Shell_Awk - Fatal编程技术网

Bash 使用Shell脚本,搜索file2中第二列的2个最近元素,查找file1中第二列的每个条目,并在file1中追加column1的元素

Bash 使用Shell脚本,搜索file2中第二列的2个最近元素,查找file1中第二列的每个条目,并在file1中追加column1的元素,bash,shell,awk,Bash,Shell,Awk,我有两个文件file1和file2(空格分隔),都包含两列。file1的第1列和第2列是Id和权重(浮点值)。类似地,file2具有Id1和权重(浮点值)。使用shell命令,如何为file1中第二列的每个条目查找file2中第二列的两个最近的、不同的元素,并在file1中追加column1的相应元素 文件1 1 10.0 2 12.1 3 5.2 4 13.0 文件2 预期o/p 1 15 10 2 10 15 3 11 17 4 10 15 cat文件1 1 10.0 2 12.1 3

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

文件1

1 10.0
2 12.1
3 5.2
4 13.0 
文件2

预期o/p

1 15 10
2 10 15
3 11 17
4 10 15
cat文件1

1 10.0
2 12.1
3 5.2
4 13.0
cat文件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        
}

您有两个以空格分隔的文件?假设f1有第1列:1 2 3 4和第2列:10.0 12.1 5.2 13.0。f2有第1列:15 10 17 12 11和第2列:11.1 12.3 2.1 15.5 7.0。我希望我的输出如下:f1行1:11510行2:21015行3:3117。第4行:4 10 15 12请举例说明。不可能理解你想要什么。(看起来像是一个编码我的问题…)抱歉@Caduchon。见我最近的评论。我举了一个简单的例子。让我解释一下,file1和file2只包含2列(给出了示例数据)。让我们从file1的第1行开始,第1行的第2个元素,即10.0,在第2列中找到两个最接近的元素,即file2中的11.1和12.3。因此,file1中第1行的解决方案变为1 15 10(我们可以覆盖第1行或插入其他文件),其中1是已经作为第一列给出的id,15和10是file2中第一列的元素,对应于11.1和12.3(选定的最近元素)。类似地,我们必须处理其他行的file1@DevAnand:用清晰的示例编辑您的初始消息。哇!非常感谢@chet。
#! /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