【问题标题】:How to merge separated fields in rows into one based on common fields in AWK / UNIX如何根据 AWK / UNIX 中的公共字段将行中的分隔字段合并为一个
【发布时间】:2015-03-29 11:52:01
【问题描述】:

我仍然只是 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

如您所见,列被分成不同的行/块,但 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

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

非常感谢。 Htat Ko

【问题讨论】:

  • 创建一个键为$1" "$2的数组
  • 原始awkgawk? Perl 或 Python 好吗?

标签: linux unix awk scripting


【解决方案1】:

不用 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

【讨论】:

    【解决方案2】:

    是的,可以使用awk

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

    【讨论】:

    • 相当整洁。唯一遇到问题的情况是一组数据中缺少其中一个键值(例如,如果缺少1 2 12F5 12F6 行)。不过,尚不清楚这是否在范围内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2014-10-14
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多