bash - 合并第一列中具有相同值的行

标签 bash join awk printing merge

我有 n 个文件,如下所示:

PACKAGE_LIST_DEV=rpm1 rpm2 rpm3
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3

例如:

文件1:

PACKAGE_LIST_DEV=rpm1 rpm2 rpm3
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3

文件2:

PACKAGE_LIST_DEV=rpm4 rpm5
PACKAGE_LIST_PROD=rpm4 rpm5

文件3:

PACKAGE_LIST_DEV=rpm6 rpm7
PACKAGE_LIST_PROD=rpm6 rpm7

等等..

我想得到以下内容:

PACKAGE_LIST_DEV=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7

因此,如果所有文件中第一列中的 PACKAGE_LIST 都相同,则它应该为每个文件生成一行,并连接所有其他部分的行。

这是我尝试过的:

# Concatenate all files together
cat File1 File2 File3 ... Filen > new_file

PACKAGE_LIST_DEV=rpm1 rpm2 rpm3
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3
PACKAGE_LIST_DEV=rpm4 rpm5
PACKAGE_LIST_PROD=rpm4 rpm5
PACKAGE_LIST_DEV=rpm6 rpm7
PACKAGE_LIST_PROD=rpm6 rpm7

# Join PACKAGE_LIST lines together
awk -F'=' -v OFS='' '{x=$1;$1="=";a[x]=a[x]$0}END{for(x in a)print x,a[x]}' new_file

PACKAGE_LIST_DEV=rpm1 rpm2 rpm3=rpm4 rpm5=rpm6 rpm7
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3=rpm4 rpm5=rpm6 rpm7

正如你所看到的,那里有一个额外的=

最佳答案

$ awk 'BEGIN{FS=OFS="="} {a[$1]=($1 in a ? a[$1] " " : "") $2} END{for (i in a) print i, a[i]}' file[1-3]
PACKAGE_LIST_PROD=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7
PACKAGE_LIST_DEV=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7

关于bash - 合并第一列中具有相同值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260347/

相关文章:

java - 使用 sed/awk/whatever 从 *nix 上的日志中获取异常

Bash - 解析 ini 文件,通过其中的值查找部分名称

linux - 扩展脚本以遍历多个文件并生成输出名称

arrays - 在 Bash 的关联数组中,declare -A 显式声明是强制的吗?

bash - grep 匹配完全子字符串忽略正则表达式语法

MySQL:创建至少一个属性所属的所有行

java - 从文件中读取并执行命令的 Bash 脚本

sql - JOIN 选择中的正确分页

MySQL连接优化——绕过文件排序

awk - 使用 awk 计算行数,无论行结束样式如何