使用awk合并两个矩阵

时间:2017-04-15 13:50:15

标签: unix matrix awk

是否可以使用awk执行以下操作?

我有两个矩阵,例如;

文件1,两个变量

1 red big
2 blue small
3 yellow big
4 grey big
5 black small

文件2,两个变量:

1 yellow 17
2 red 22
3 blue 15
4 violet 32

我想获得:

1 red big 22
2 blue small 15
3 yellow big 17
4 grey big
5 black small
6 violet 32

我试过这个:awk 'NR==FNR {h[$2] = $3; next} {print $1,$2,$3,h[$2]}' File 2 File 1 > File 3虽然它不包含第二个文件的变量。

2 个答案:

答案 0 :(得分:1)

您现有的代码完成了一半的工作。您输入的代码如下:

1 red big 22 
2 blue small 15 
3 yellow big 17 
4 grey big   
5 black small

您不包括的内容是file2中存在的条目,但是文件1中缺少这些条目。尝试一下:

awk 'NR==FNR {h[$2] = $3; next}{print $1,$2,$3,h[$2];delete h[$2]}END{for (i in h) print i,h[i]}' file2 file1

在这种情况下,输出将是:

1 red big 22 
2 blue small 15 
3 yellow big 17 
4 grey big   
5 black small
violet 32

然后您需要决定在“孤儿”条目前应用的号码。 您可以应用4紫罗兰32,因为4是文件2中的$ 1,或者您可以在所有条目中应用全局增量计数:

awk 'NR==FNR {h[$2] = $3; next}{print ++c,$2,$3,h[$2];delete h[$2]}END{for (i in h) print ++c,i,h[i]}' file2 file1

在这种情况下输出将是:

1 red big 22 
2 blue small 15 
3 yellow big 17 
4 grey big   
5 black small
6 violet 32

答案 1 :(得分:0)

以下是使用join进行加入,sort进行排序,处理替换以及使用nl对行进行编号的方法:

$ nl <(join -a 1 -a 2 <(cut -d \  -f 2- file1 | sort) <(cut -d \  -f 2- file2|sort))
     1  black small
     2  blue small 15
     3  grey big
     4  red big 22
     5  violet 32
     6  yellow big 17