如何根据 AWK / UNIX 中的公共字段将行中的分隔字段合并为一个

How to merge separated fields in rows into one based on common fields in AWK / UNIX

我仍然只是 UNIX 的新用户,尤其是 AWK。我在根据前 2 列值合并行时遇到问题。我来自文件的原始数据如下:

Original data content
========================

ID1 ID2 Field1  Field2
1   1   11F1    11F2
1   2   12F1    12F2
2   1   21F1    21F2
2   2   22F1    22F2
ID1 ID2 Field3  Field4
1   1   11F3    11F4
1   2   12F3    12F4
2   1   21F3    21F4
2   2   22F3    22F4
ID1 ID2 Field5  Field6
1   1   11F5    11F6
1   2   12F5    12F6
2   1   21F5    21F6
2   2   22F5    22F6

如您所见,列被分成不同的 rows/block,但 ID 字段和列标题仍然可用并重复。所以我想要实现的是:

ID1 ID2 Field1  Field2  Field3  Field4  Field5  Field6
1   1   11F1    11F2    11F3    11F4    11F5    11F6
1   2   12F1    12F2    12F3    12F4    12F5    12F6
2   1   21F1    21F2    21F3    21F4    21F5    21F6
2   2   22F1    22F2    22F3    22F4    22F5    22F6

将所有内容合并为一个 block/table。 但不知道如何在 AWK 中实现,或者是否可以使用 AWK 实现。

非常感谢。 达哥

是的,可以使用 awk:

awk ' 
{ key =  FS  }
!seen[key]++ { keys[++total] = key }
{ values[key] = ( key in values ? values[key] FS  FS  :  FS  ) }
END {
    for (cnt=1; cnt<=total; cnt++) 
    print keys[cnt], values[keys[cnt]]
}' file
  • 形成第一列和第二列作为键
  • 使用数组seen记住出现的顺序。
  • 测试你的键是否存在于数组中(我们在这里使用三元运算)。如果存在,则将现有值附加到新数据集。如果不存在,将其作为值推送。
  • END块中,迭代并打印。
  • 如果您有很多列,则将列存储在一个变量中,并在存储之前从中删除键。

你也可以在没有 Awk 的情况下执行此操作:

$ sort -n data | sed -e 's/  */ /g' | paste - - - -d' ' | cut -d' ' -f 1,2,3,4,7,8,11,12

输出

ID1 ID2 Field1 Field2 Field3 Field4 Field5 Field6
1 1 11F1 11F2 11F3 11F4 11F5 11F6
1 2 12F1 12F2 12F3 12F4 12F5 12F6
2 1 21F1 21F2 21F3 21F4 21F5 21F6
2 2 22F1 22F2 22F3 22F4 22F5 22F6