我们有这么一个需求:将相同姓名相同的数据合并成一行
lihanghang@DXP4800-532F:~/script$ cat file
张三 语文 74 A
张三 物理 84 B
张三 化学 91 C
张三 物理 74 D
李四 物理 99 A
李四 语文 89 B
李四 数学 78 C
实现的结果应该如下:
李四 物理 99 A 语文 89 B 数学 78 C
张三 物理 99 A 语文 89 B 数学 78 C
我通过如下代码进行实现:
lihanghang@DXP4800-532F:~/script$ cat file |perl -nale '$a=$F[0];$b=join " ",@F[1..$#F];push @{$hash{$a}},$b;END{for(keys %hash){print "$_ @{$hash{$a}}"}}'
张三 物理 99 A 语文 89 B 数学 78 C
李四 物理 99 A 语文 89 B 数学 78 C
下面我来解释如上代码的含义:
$a=$F[0];:代表将第一列数据存放到变量$a中
$b=join " ",@F[1..$#F]; 代表将除第一列的数据存放到变量$b中,并且通过列表操作符join使用空格进行分割
push @{$hash{$a}},$b; 代表将变量$b的数据存放到该数组中
END:代表前面的代码执行完毕后,进行后续代码处理
for(keys %hash):这里就牵扯到hash的操作,keys代表将哈希hash的key值取出,分别是张三、李四
{print "$_ @{$hash{$a}}"}:这里的$_就代表哈希hash对应的key:张三、李四;@{$hash{$a}},代表的就是将我们保存的整个数组给取出来