【问题标题】:Using AWK to merge unique rows based on column one使用 AWK 根据第一列合并唯一行
【发布时间】:2019-11-05 01:31:37
【问题描述】:

我正在尝试编写一个 AWK 脚本来汇总大型文本文件中的数据。结果数据的顺序很重要,所以我不能使用排序。

我尝试了 FNR==NR 的不同变体,但没有任何运气

输入文件

Height 3.5
Weight 12.3
Age 23
: 
:
Height 4.5
Weight 15.5
Age 31
:
:

预期输出

Height 3.5 4.5
Weight 12.3 15.5
Age 23 31

【问题讨论】:

  • 请提供您的尝试

标签: bash unix awk sed text-processing


【解决方案1】:

使用awk's array 可以对值进行分组。

这是一个简化版:

BEGIN {
summary["Weight"] = "Weight";
...
}
{
summary[$1] = summary [$1] " " $2
}
END {
print summary["Weight"];
...
}

【讨论】:

    【解决方案2】:

    使用 awk:

    awk '{a[$1]=a[$1] FS $2} END{for(i in a) print i a[i]}' file
    

    输出:

    重量 12.3 15.5 身高 3.5 4.5 : 年龄 23 31

    源自:how to merge rows that share unique IDs into a comma separated table


    见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

    【讨论】:

    • 智能、优雅、简洁。我喜欢它。
    【解决方案3】:

    这不是 awk,但可能对你有用(GNU sed):

    sed -E 'H;g;s/((\n\S+)[^\n]*)(.*)\2(.*)/\1\4\3/;h;$!d;x;s/.//' file 
    

    使用保留空间收集每个键的结果,并在文件末尾删除引入的换行符并打印结果。

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 2019-12-29
      • 1970-01-01
      相关资源
      最近更新 更多