首页 > 解决方案 > 如何在awk中组合来自两个TXT文件的字段

问题描述

我有两个文本文件,内容如下:

总和.txt

|Name       |Sum |

|User A     |100.0 |

|User B     |40.0 |

per_proj.txt

|Name   |Project   |Hours |

|User A |Project 1 |50.0 |

|User A |Project 2 |30.0 |

|User A |Project 3 |20.0 |

|User B |Project 1 |20.0 |

|User B |Project 2 |20.0 |

我想要实现的是合并这两个文件并获得如下输出:

              |Sum   | Project 1 | Project 2| Project 3|

|User A     |100.0 |50.0         |30.0             |20.0 |

                        | Project 1 | Project 2| 

|User B     |100.0 |20.0              |20.0             |

有人可以分享他/她对此的了解吗?

我正在使用在这里找到的 awk 片段进行锻炼(从如何使用 AWK 合并两个文件开始?),但没有成功:(

标签: awk

解决方案


您真正需要的只是您的per_proj.txt文件。即时计算总和(注意:特定于 GNU awk):

$ gawk 'BEGIN { FS = OFS = "|" }
        NR > 1 { users[$2] += $4; projects[$3] = 1; projecttotals[$2, $3] += $4 }
        END {
          PROCINFO["sorted_in"] = "@ind_str_asc"
          printf "| Name | Sum |"
          for (p in projects) printf " %s |", p
          printf "\n"
          for (u in users) {
            printf "| %s | %.1f |", u, users[u]
            for (p in projects) printf " %.1f |", projecttotals[u, p]
            printf "\n"
          }
        }' per_proj.txt
| Name | Sum | Project 1  | Project 2  | Project 3  |
| User A  | 100.0 | 50.0 | 30.0 | 20.0 |
| User B  | 40.0 | 20.0 | 20.0 | 0.0 |

您可能需要花点时间才能获得所需的确切输出格式,但这应该会给您这个想法。


推荐阅读