【问题标题】:Merge lines with the same value in the first column合并第一列中具有相同值的行
【发布时间】:2017-01-08 16:16:18
【问题描述】:

我有 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

如您所见,这里有一个额外的 =

【问题讨论】:

    标签: bash join awk printing merge


    【解决方案1】:
    $ 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
    

    【讨论】:

      【解决方案2】:

      如果文件中的关键字段按排序顺序排列,另一种选择是使用joinsed。将任意数量的文件合并在一起:

      $ join -t= file1 file2 | join -t= - file3 | sed 's/=/ /g;s/ /=/'
      PACKAGE_LIST_DEV=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7
      PACKAGE_LIST_PROD=rpm1 rpm2 rpm3 rpm4 rpm5 rpm6 rpm7
      

      ... 其中| join -t= - file3 部分可以包含任意多次,具有不同的文件名,例如...| join -t= - file4 | join -t= - file5...等

      awk 解决方案运行良好,适用于关键字段未按排序顺序但将文件内容保存在内存中的情况,因此在处理大量文件时可能会遇到困难。只要文件中的关键字段按排序顺序排列,join/sed 解决方案就适用于任何长度的文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 2021-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多