2017-02-24 19 views
2

我的特殊任务是以file1中的方式排列文件2中的行,其中file1中的数字应与file2中的数字相对应。我的输出文件:在没有“下一个”语句的情况下在awk中处理多个文件

文件1

23 
4 
75 
19 

文件2

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,但它没有奏效。

感谢您的任何建议。

+0

如果不是特定的顺序,'join'会有蜜蜂n perfect – Aaron

+2

为什么你需要它而没有'next'? – Inian

回答

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 
3

没有理由为什么你不能在这里使用next 。逻辑非常简单,为$1中的每条记录创建file2file1的散列映射,并打印出散列值。

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

谢谢你的回答,印尼语。我想在没有“下一个”的情况下使用它,因为我认为创建一个数组会破坏顺序并给出正确但无序的答案。 – MirrG

+0

@MirrG:好吧'你以为'可能会,但是在我的回答中是可能的!所以它解决了你的问题? – Inian

+0

是的,当然,我不认为只是使用哈希值。 – MirrG

1

如果你想过程为了文件,即文件1之前文件2不下一那么你可以使用这个AWK-脚本中使用,文件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 
相关问题