将文件中的值与第二个文件中的查找相匹配

时间:2018-11-09 07:12:37

标签: shell awk

我有三个文件,一个数据文件,一个查询文件,另一个查询文件

数据文件的一个字段必须更改一个值,该值可以在查找文件中找到。

数据文件如下:

2013-04-24;1;0.1635;1.4135
2013-04-24;1;0.9135;1.4135
2013-04-24;2;0.9135;1.4135

查找文件如下:

1;2ab1e4c0-de4d-11e2-a934-0f0479162b1b
2;2ab21e90-de4d-11e2-9ce8-d368d9512bad
3;2ab2582e-de4d-11e2-bb5f-6b1f6c4437f8

结果必须是:

2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b 0.1635 1.4135
2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b 0.9135 1.4135
2013-04-24 2ab21e90-de4d-11e2-9ce8-d368d9512bad 0.9135 1.4135

要在上面的输出中使用的另一个查找文件:

2ab1e4c0-de4d-11e2-a934-0f0479162b1b AAA
2ab1e4c0-de4d-11e2-a934-0f0479162b1b AAA
2ab21e90-de4d-11e2-9ce8-d368d9512bad CCC

我希望最终输出为:

2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b AAA 0.1635 1.4135
2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b AAA 0.9135 1.4135
2013-04-24 2ab21e90-de4d-11e2-9ce8-d368d9512bad CCC 0.9135 1.4135

这是我的awk命令,我也在这里找到:

awk -F';' 'NR==FNR{a[$1]=$2;next}{$2=a[$2]}1' Datafile.csv Lookupfile1.csv

2 个答案:

答案 0 :(得分:0)

交换文件顺序:

#include <stdio.h>
#include <math.h>

int getYearOfBirth (void); // prompt user to enter a year of birth , below 1900 show no valid

int main () {
    int y;

    y = getYearOfBirth();

    printf("%d\n\n",y);

    return 0;
}

int getYearOfBirth (void) {
    int yearOfBirth;
    int confirm1;

    while (1) {
        printf("Please enter your year of birth:\n");
        scanf("%d", &yearOfBirth);

        if (yearOfBirth < 1900) {
            printf("Warning! The year you entered is not valid!\n");
            printf("Please Enter Again.\n");
            continue;
        }

        printf("Your year of birth is: %d\n",yearOfBirth);

        printf("Is it correct? Enter 1 for YES to Continue ,0 for NO and Re-Enter\n");
        scanf("%d",&confirm1);
        if (confirm1 == 1) {
            printf("Year of birth confirmed\n\n\n");
            break;
        }
    } 

    return yearOfBirth;
}

逻辑继续进行第二次查找:

awk -F';' 'NR==FNR{a[$1]=$2;next}{$2=a[$2]}1'  Lookupfile1.csv Datafile.csv

答案 1 :(得分:0)

您可以为此使用简单的unix命令join

mayankp@mayank:~/$ join -1 2 -2 1 -t';' -o 1.1,2.2,1.3,1.4 datafile.txt lookup1.txt | sed 's/;/ /g'
2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b 0.1635 1.4135
2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b 0.9135 1.4135
2013-04-24 2ab21e90-de4d-11e2-9ce8-d368d9512bad 0.9135 1.4135

将上述临时输出写入文件res.txt中。然后,将此文件与第二个查找文件结合起来以获取最终结果

mayankp@mayank:~/$ join -1 2 -2 1 -t';' -o 1.1,2.2,1.3,1.4 datafile.txt lookup1.txt | sed 's/;/ /g' > res.txt

mayankp@mayank:~/$ join -1 2 -2 1 res.txt lookup2.txt -o 1.1,1.2,2.2,1.3,1.4 |uniq
2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b AAA 0.1635 1.4135
2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b AAA 0.9135 1.4135
2013-04-24 2ab21e90-de4d-11e2-9ce8-d368d9512bad CCC 0.9135 1.4135

有了这个,您不必记住复杂的语法。让我知道是否有帮助。

OR

您可以在一行中组合以上命令:

mayankp@mayank:~/$ join -1 2 -2 1 <(join -1 2 -2 1 -t';' -o 1.1,2.2,1.3,1.4 datafile.txt lookup1.txt | sed 's/;
/ /g') lookup2.txt -o 1.1,1.2,2.2,1.3,1.4 |uniq
2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b AAA 0.1635 1.4135
2013-04-24 2ab1e4c0-de4d-11e2-a934-0f0479162b1b AAA 0.9135 1.4135
2013-04-24 2ab21e90-de4d-11e2-9ce8-d368d9512bad CCC 0.9135 1.4135