将文本文件中同一键的多个值分组以形成单个键值对



首先,如果这个问题有更好的标题,我全听!

有没有更好的方法

我有一个input.txt这种格式的数据文件:

field1=value1
field2=value2
field3=value3
.
.
.
field1=value4
field2=value5
field3=value6

等等...并希望以:

field1,value1 value4 ... valueM
field2,value2 value5 ... valueN
field3,value3 value6 ... valueO

我尝试过:

  1. 生成唯一键:cat input.txt |awk -F"=" '{print $2}' |sort -u > data_key

  2. 循环访问data_key中的行

#!/bin/bash
file=input.txt
keys=`cat data_key`
for value in $keys
do
  output=`cat $file |grep $value |awk -F"=" '{print $2}' |tr -s '[:space:]' '[ *]' `
  echo $value, $output
done

Perl 解决方案。它对字段进行哈希处理,每个字段都与一个值数组相关联。但是,输出行的顺序是随机的。

perl -e 'while (<>) {
             chomp;
             ($f, $v) = split /=/, $_, 2;
             push @{ $h{$f} }, $v;
         }
         print "$_,@{ $h{$_} }n" for keys %h;
    ' input.txt

以下基于 awk 的解决方案应该可以工作。这使用按字段名称键控的关联数组。值在遇到时串联起来。

awk -F'=' '{z[$1]=z[$1]" "$2} END{for(i in z){print(i","z[i])}}' file_name.txt
awk -F"=" '{a[$1]=a[$1]","$2;}END{for(i in a)print i,a[i];}' your_file

测试如下:

> cat temp
field1=value1
field2=value2
field3=value3
field1=value4
field2=value5
field3=value6
> awk -F"=" '{a[$1]=a[$1]","$2;}END{for(i in a)print i,a[i];}' temp
field1 ,value1,value4
field2 ,value2,value5
field3 ,value3,value6
>

相关内容

  • 没有找到相关文章

最新更新