【问题标题】:Merge two matrices using awk使用 awk 合并两个矩阵
【发布时间】:2017-04-18 05:34:43
【问题描述】:

是否可以使用 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 虽然它不包含第二个文件的变量。

【问题讨论】:

  • 所以你想在file1的所有行之后添加file2中而不是file1中的键来结束?试试awk 'NR==FNR {h[$2] = $3; next} {print $0,h[$2]; delete h[$2]} END{for (k in h){print ++FNR, k, h[k]}}' file2 file1 ...

标签: unix matrix awk


【解决方案1】:

您现有的代码完成了一半的工作。你的代码输出是这样的:

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

您不包括的是文件 2 中存在但文件 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 Purple 32 因为 4 是 file2 中的 $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

【讨论】:

    【解决方案2】:

    这是一个使用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
    

    【讨论】:

      猜你喜欢
      • 2014-08-16
      • 2017-05-16
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多