在没有“next”语句的情况下处理awk中的多个文件

时间:2017-02-24 10:14:38

标签: bash awk

我的特殊任务是以file1中的方式排列文件2中的行,其中file1中的数字应与file2中的数字相对应。我的输出文件:

文件1

23
4
75
19

file2的

4 apple
19 mango
23 kiwi
75 orange

欲望输出:

23 kiwi
4 apple
75 orange
19 mango

现在,我只是用bash做了,但我特别感兴趣的是可以在awk中这样做。我尝试了以下代码NR==FNR {a=$1} NR!=FNR {if ($1==a) print $0;next}' file1 file2,但它没有用。

感谢您的任何建议。

3 个答案:

答案 0 :(得分:3)

没有理由不在这里使用next。逻辑是直截了当的,为file2中的file1$1创建哈希映射,打印出其散列值。

awk 'FNR==NR{hash[$1]=$2; next}{print $1,hash[$1]}' file2 file1
23 kiwi
4 apple
75 orange
19 mango

答案 1 :(得分:2)

您可以尝试使用next声明

awk 'NR==FNR {d[$1]=$0; next} {print d[$1]}' file2 file1

没有next声明

awk 'NR==FNR {d[$1]=$0} NR!=FNR{print d[$1]}' file2 file1

你明白了,

23 kiwi
4 apple
75 orange
19 mango

答案 2 :(得分:1)

如果您想按顺序处理文件,例如 file1之前的文件2 不使用下一个,那么您可以使用此awk-script ,档案fruits.awk

#!/usr/bin/awk

{
    if(a1[$1]!=1)
        a1[$1]=a2[FNR][$1]=1;
    else{

        for(i in a2) {
            for(j in a2[i])
                if(j==$1)
                    a2[i][j]=$2;
        }
    }
}

END {
    for(i in a2) {
        for(j in a2[i])
            print j, a2[i][j];
    }
}

使用:

$awk -f fruits.awk file1 file2
23 kiwi
4 apple
75 orange
19 mango